我在静态库中有一个全局,它从ctor / dtor中的注册商注册和注销,但是没有通过-u symbol
或--whole-archive
它就永远不会被调用。
使用msvc,您可以强制在代码中使用#pragma comment(linker, "/include:__mySymbol")
包含符号来解决此问题。我能用代码,gcc和/或clang来做同样的事情吗?
重现这一点非常容易:
可执行文件:
// main.cpp
int main() {}
静态库依赖于可执行文件:
// test.cpp
#include <iostream>
struct Test {
Test() { std::cout << "Test()\n"; }
~Test() { std::cout << "~Test()\n"; }
};
Test test;
如果静态库是共享库,则打印该程序。如果静态库使用--whole-archive
,程序将打印出来。但是我想在代码中控制它,而不是使用次优的编译标志(或-u symbol
:编译标志依赖于代码中的符号名称。)