从静态库链接函数的g ++错误

时间:2018-04-18 16:02:05

标签: c++ linker static-libraries

我有一个Qt5 C ++程序,我试图链接到静态库。静态库是senselock / libsenseEIV.a(相对于main.cpp文件)。当我编译时,我看到下面的输出:

                                                                      ^
g++ -Wl,-rpath,/opt/Qt/5.7/gcc_64/lib -o test1 main.o   -Lsenselock/libsenseEIV.a -L/opt/Qt/5.7/gcc_64/lib -lQt5Core -lpthread 
main.o: In function `test1()':
/test1/main.cpp:31: undefined reference to `S4Enum'
/test1/main.cpp:58: undefined reference to `S4Enum'
/test1/main.cpp:71: undefined reference to `S4Open'
/test1/main.cpp:83: undefined reference to `S4Control'
/test1/main.cpp:102: undefined reference to `S4Close'
collect2: error: ld returned 1 exit status
make: *** [Makefile:216: test1] Error 1
11:55:27: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project test1 (kit: Desktop Qt 5.7.1 GCC 64bit)
When executing step "Make"

在我的.pro文件中我有

LIBS += -Lsenselock/libsenseEIV.a

如果重要的话。有人可以解释如何解决此错误?未定义的引用错误都与位于libsenseEIV.a库中的函数有关。

我不明白编译器是否找不到.a文件或者还有其他错误。

更新:我尝试了这种语法

LIBS += -Lsenselock -lsenseEIV

但它会产生错误

  

/ usr / bin / ld:找不到-lsenseEIV

我使用错误的库名吗?如果是这样,我怎么能找到这个名字? (假设这被编译成.a文件)

2 个答案:

答案 0 :(得分:2)

命令行的这一部分是错误的:

 -Lsenselock/libsenseEIV.a

应该是:

 senselock/libsenseEIV.a

-Lfoo/bar.a告诉链接器搜索目录foo/bar.a/的库,根本不是你想要的东西。)

  

没有-l前缀?

您可以使用以下(大多数等效)方式指定与libsenseEIV.a的关联:

senselock/libsenseEIV.a
-Lsenselock -lsenseEIV
-Lsenselock -l:libsenseEIV.a

答案 1 :(得分:1)

您使用的链接器标记错误,您应该在-L之后指定库路径,在-l之后指定库名称。换句话说,您需要在.pro文件中分配LIBS变量。

毕竟事实证明你可以使用LIBS += -L$$PWD/senselock/ -lsenseEIV作为案件