可能是我能想到的最短的工作示例:
的CMakeLists.txt :
project(myprogs)
cmake_minimum_required(VERSION 2.8)
add_executable(myprog2 main.c)
add_executable(myprog main.cpp)
add_library(mylib SHARED mylib.c)
target_link_libraries(myprog2 mylib)
target_link_libraries(myprog mylib)
main.c / main.cpp (相同内容):
#include "mylib.h"
int main(int argc, char** argv)
{
doit();
}
mylib.h :
#ifndef MYLIB_H
#define MYLIB_H
void doit(void);
#endif
mylib.c :
#include "mylib.h"
#include <stdio.h>
void doit(void)
{
printf("doit");
}
系统:
当我执行make myprog
时,myprog
的链接阶段会抱怨doit
有未定义的引用。但是,如果我使用make myprog2
,则所有内容都会正确链接,程序会按预期运行。
我不明白为什么CMake在C ++程序中没有正确地链接到mylib
。从编译器中获取详细输出(我已经修剪了一些到系统库路径/目标文件的链接):
&#34;在/ usr /斌/ LD&#34; -export-dynamic --eh-frame-hdr -m elf_x86_64 -dyna mic-linker /lib64/ld-linux-x86-64.so.2 -o myprog CMakeFiles / myprog.dir / main.cpp.o libmylib.so -rpath / home / andrew / code / misc / myprog / build -lstdc ++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
奇怪的是,它没有使用-lmylib
来链接mylib。我得到myprog2
的类似输出。
我的问题是为什么会发生这种情况,更重要的是,如何让myprog
正确链接到mylib
?
答案 0 :(得分:14)