【问题标题】:How do I correctly link in static libraries with g++?如何使用 g++ 正确链接静态库?
【发布时间】:2013-02-12 16:28:24
【问题描述】:

我正在尝试做一个相当复杂的构建,但我会为这个问题稍微简化一下。我有三个 c++ 文件(main.cpp file2.cpp 和 file3.cpp),我正在尝试编译并链接到 3 个静态库(libx.a liby.z libz.a)以生成可执行文件。

涉及到很多依赖。

所有三个 c 文件都依赖于所有 3 个库。 libx 依赖于 liby 和 libz。最后,libx 还依赖于 file2.cpp 中包含的几个回调函数。

什么命令行可以正确构建它?我已经尝试了几十种变体,但还没有一个能让链接器满意。

如果重要的话,这些库是用 gcc 编译的纯 c 代码。来源是 c++,我正在用 g++ 编译/链接。我将它作为一个 Visual Studio 项目正常工作,并且正在尝试移植到 linux。

【问题讨论】:

    标签: c++ c gcc linker g++


    【解决方案1】:

    来自您的帖子:

    g++ main.cpp file2.cpp file3.cpp -lx -ly -lz
    

    但是,如果静态链接给您带来问题,或者您需要分发任何库,那么您可以考虑将它们共享对象.so 文件,通常称为DSO )。在这种情况下,例如在构建libx.a 时,将所有源代码编译为目标文件,然后将它们与

    g++ -shared *.o -o libx.so -ly -lz
    

    (这个版本假设liby.alibz.a是静态的,会合并成libx.so

    【讨论】:

    • 而不是污染答案,但是当您说“回调”时,您是在file1.cpp 中传递函数的指针,还是在@987654330 中直接引用了来自file1.cpp 的函数@?前者根本没有问题,第二个不好,并且表明(不知道更多)file1.cpp 应该是libx.a 的一部分
    • 激进,不幸的是后者,这个解决方案对我不起作用。
    • 我认为这个命令行应该仍然符合要求。但是,您的情况不是最佳的(好吧,真的,这是糟糕的软件分解)。一种可能的解决方案是将file1.cpp 拆分为需要在libx.a 中的部分,并将其余部分分开。这与答案无关,但可能对您目前的情况有所帮助。
    • 我现在无法重构此代码 - 它是我的老板创建的,并转交给我用于移植和添加新功能。不过我同意你的看法。不知道为什么这个解决方案对我不起作用......我会继续使用它。
    • 啊,这很重要。最好将您的库变成共享对象(例如,Linux 中的.sos)。
    【解决方案2】:

    您可能需要在 .cpp 文件中使用 extern "C" { } 以包含 C 库的标头。

    How To Mix C and C++ 中查看Including C Headers in C++

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      相关资源
      最近更新 更多