我想为我的所有文件创建一个静态库,以便我可以将 mylib.a 文件提供给其他人在他们的系统上执行。我在代码中使用 opencv 库。我使用以下命令来编译我的代码。
g++ index.cpp -o display1 -Wl,-Bdynamic pkg-config --cflags --libs opencv -lglut -lGL -lGLU -Wl,-Bstatic mylib.a
但它给出了以下错误。
/usr/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
最佳答案
我相信 Kerrek SB 的评论是正确的。命令应该是
g++ index.cpp -o display1 mylib.a $(pkg-config --cflags --libs opencv) -lglut -lGL -lGLU
说明:
-Wl,-Bdynamic
和-Wl,-Bstatic
标志没有用。链接器根据它找到的内容自动选择静态或动态库。如果你给它一个库的路径(就像你对mylib.a
所做的那样),它就无法选择并会链接你提供的库。如果您给它一个-l
X 标志,它将查找lib
X.so
或lib
X.a
并链接它找到的任何一个,但大多数 Linux 安装不会有系统库的静态变体,因此两者都没有什么可以选择的。- 更糟糕的是,
-Wl,-Bdynamic
和-Wl,-Bstatic
是错误。-Wl,-Bstatic
禁止链接共享库。这具有选择静态 libgcc 的副作用,它隐式地出现在链接器命令行的最后。而且你好像没有安装这个。大多数 Linux 系统都没有。 - 每个对象都必须列在命令行上它所引用的库之前。我希望
mylib.a
包含需要 opencv 或 opengl 的函数,因此它必须列在那些-l
标志之前。
关于c++ - 编译静态库时 GCC 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11858480/