CMake 不会 Link C 库到 C++ 程序
CMake won't Link C library to C++ program
可能是我能想到的最短的工作示例:
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");
}
系统:
- Ubuntu 15.10
- gcc 5.2.1/clang 3.6.2(都试过了)
- CMake 3.2.2
当我执行 make myprog
时,myprog
的 link 阶段抱怨存在对 doit
的未定义引用。但是,如果我使用 make myprog2
,所有 link 都正确并且程序按预期运行。
我不明白为什么 CMake 在 C++ 程序中不能正确地 linking 到 mylib
。获取编译器提供的详细输出形式(我已经将一些 linking 修剪到系统库 paths/object 文件):
"/usr/bin/ld" -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
到 link 与 mylib。 myprog2
.
得到类似的输出
我的问题是为什么会这样,更重要的是,我如何让 myprog
正确地从 link 到 mylib
?
可能是我能想到的最短的工作示例:
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");
}
系统:
- Ubuntu 15.10
- gcc 5.2.1/clang 3.6.2(都试过了)
- CMake 3.2.2
当我执行 make myprog
时,myprog
的 link 阶段抱怨存在对 doit
的未定义引用。但是,如果我使用 make myprog2
,所有 link 都正确并且程序按预期运行。
我不明白为什么 CMake 在 C++ 程序中不能正确地 linking 到 mylib
。获取编译器提供的详细输出形式(我已经将一些 linking 修剪到系统库 paths/object 文件):
"/usr/bin/ld" -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
到 link 与 mylib。 myprog2
.
我的问题是为什么会这样,更重要的是,我如何让 myprog
正确地从 link 到 mylib
?