g++ 从静态库链接函数时出错

问题描述 投票:0回答:3

我有一个 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文件中)

c++ linker static-libraries
3个回答
3
投票

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

 -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
投票

您使用的链接器标志错误,您应该在

-L
之后指定库路径,并在
-l
之后指定库名称。换句话说,您需要在 .pro 文件中对
LIBS
变量进行赋值。

毕竟事实证明您可以将

LIBS += -L$$PWD/senselock/ -lsenseEIV
用于您的情况


0
投票

这是一个出现问题的示例(以 VERBOSE=1 运行)

/usr/bin/gcc CMakeFiles/central.dir/central_manager.c.o CMakeFiles/central.dir/main.c.o -o central  ../../binc/libSDK.a -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lm 
/usr/bin/ld: CMakeFiles/central.dir/manager.c.o: in function `on_connection_state_changed':
manager.c:(.text+0x3a4): undefined reference to `configure'
© www.soinside.com 2019 - 2024. All rights reserved.