【发布时间】:2012-12-16 11:42:30
【问题描述】:
我有一个程序和一个静态库:
// main.cpp
int main() {}
// mylib.cpp
#include <iostream>
struct S {
S() { std::cout << "Hello World\n";}
};
S s;
我想将静态库(libmylib.a)链接到程序对象(main.o),虽然后者不直接使用前者的任何符号。
以下命令似乎不适用于g++ 4.7。它们将运行而不会出现任何错误或警告,但显然libmylib.a 不会被链接:
g++ -o program main.o -Wl,--no-as-needed /path/to/libmylib.a
或
g++ -o program main.o -L/path/to/ -Wl,--no-as-needed -lmylib
你有更好的想法吗?
【问题讨论】:
-
@chris 我已经把问题说得更清楚了 -lmylib 不会改变情况
-
静态 s 可以在 main 之前的任何地方初始化,直到第一次调用该翻译单元中的函数......这意味着根据标准,从不实例化 s 是有效的,因为没有函数来自该翻译单元曾经被调用过。
-
+1,几周前我遇到了完全相同的情况。我有一些小型库和一个使用所有较小库的较大库(嗯,不一定通过调用它们的方法;它将它们“捆绑”在一起)。最终的应用程序应该使用更大的库以及与之“捆绑”的较小的库,但它们不存在,因为较大的库没有使用它们。我通过在小型库中引入一个虚拟方法并在更大的库中使用它们来解决问题......肮脏的黑客! :\我期待看到这个问题的好答案:)
-
@K-ballo 但构造函数 S::S() 是 从定义 S 的翻译单元调用的。还是我在您的评论中遗漏了什么?
-
您错过了这样一个事实,即完全符合的实现可以在调用该翻译单元的第一个函数之前实例化其全局变量,在您的情况下永远不会......