【发布时间】:2025-12-27 12:10:07
【问题描述】:
问题如下:您有两个文件,一个用于库,一个用于可执行文件,您要调用库中定义但在可执行文件中声明的方法:
lib.cpp:
extern void Method();
void DoStuff() {
Method();
}
main.cpp:
#include <iostream>
void Method() {
std::cout << "Do Stuff" << std::endl;
}
int main() {
Method();
return 0;
}
现在使用 cmake 我只是想告诉库 DoStuff 方法的声明在可执行目标中。
使用这个简单的 CMakeLists.txt 会导致未定义的符号链接器错误:
Undefined symbols for architecture x86_64:
"Method()", referenced from:
DoStuff() in lib.cpp.o
CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(extern)
set(CMAKE_CXX_STANDARD 14)
add_library(myLib SHARED lib.cpp)
add_executable(exe main.cpp)
target_link_libraries(exe myLib)
我发现的唯一方法是通过一个临时静态库并将我的共享库与那个我认为非常讨厌的静态库链接,因为我很快就会向可执行文件添加更多类我得到重复的符号(这完全有道理因为它们是重复的)
add_library(tmpLib STATIC main.cpp)
target_link_libraries(myLib tmpLib)
我已经浏览了两个晚上的互联网,现在正在寻找一种方法来做到这一点,但我仍然完全没有任何线索。
【问题讨论】: