【发布时间】:2019-11-23 20:19:55
【问题描述】:
情况:
假设我有 2 个库(libA.a、libB.a)我想在可执行文件 (exec.cpp) 中使用。
我的libA 包括在libB 的函数bar(y) 中使用的foo(x)。因此,我在libB 中包含libA 的标头,然后在我的可执行文件中包含libB 的标头并链接两者:
A.h:
#ifndef LIB_A_INCLUDED
#define LIB_A_INCLUDED
int foo(int x);
#endif
A.cpp:
int foo(int x) {
//DO stuff
}
B.h
#ifndef LIB_B_INCLUDED
#define LIB_B_INCLUDED
#include <A.h>
int bar(int y);
#endif
B.cpp:
int bar(int y) {
foo(y);
//more stuff
}
两个库的 CMakeLists 文件如下所示(对于 libB,还有一个 include_directories 调用以包含 A.h):
cmake_minimum_required(VERSION 3.15)
project(libA)
set(CMAKE_CXX_STANDARD 14)
add_library(libA A.h A.c)
Exec.cpp:
#include<B.h>
int main() {
bar(42);
return 0;
}
可执行文件的 CMakeLists 文件如下所示:
cmake_minimum_required(VERSION 3.15)
project(Exec)
set(CMAKE_CXX_STANDARD 14)
include_directories("PATH_TO_HEADER_A/A.h" "PATH_TO_HEADER_B/B.h")
add_executable(Exec main.cpp)
target_link_libraries(Exec "PATH_TO_LIB_A/libA.a;PATH_TO_LIB_B/libB.a")
问题
这不起作用!它产生:
/usr/bin/ld: PATH_TO_LIB_B/libB.a(B.c.o): in function `bar':
/usr/bin/ld: PATH_TO_LIB_B/B.cpp:95: undefined reference to `foo'
但是,当我将 Exec.cpp 更改为:
#include<B.h>
int main() {
bar(42);
foo(31415);
return 0;
}
它按预期编译和工作 - 当 exec.cpp 中没有直接使用 libA 的函数时,链接器似乎没有链接 libA,即使这些函数在 @ 中使用987654342@ 肯定是使用foo。
问题
有没有办法强制链接?我如何让它发挥作用?
【问题讨论】:
-
图书馆的链接顺序很重要,请参阅重复问题的答案:stackoverflow.com/questions/12573816/…
-
那么正确的顺序是什么?因为我确实考虑了顺序 - 这就是为什么 libA 在 target_link_libraries 列表中排在第一位的原因。对我来说这是有道理的,为什么会出现这种情况,但不应该首先链接“较低”(在我的情况下是 libA,因为它在 libB 中使用,而它又被可执行文件使用)库?另外,为什么我在可执行文件中使用“foo(x)”而不更改其他任何内容时它会起作用?
-
引用答案的引用:“一般来说,如果库 A 依赖于库 B,则 libA 必须出现在链接器标志中的 libB 之前。”。在您的情况下,
libB依赖于libA,因此libB应该在target_link_libraries调用中之前libA。