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");
}

系统:

当我执行 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

您需要声明 functions with extern "C" in c++. The 编译器更改函数名称以允许函数重载,例如

int function(int value);

int function(char *value);

两者都可以在 中定义为完全相同的名称,编译器将生成两个具有不同名称的不同函数以使其正常工作。

中不能这样做,函数名也不需要修改。通过使用 extern "C" 可以防止编译器更改函数名称,因此 link 阶段将按预期工作。

要修复它,请这样开始 main.cpp:

extern "C" {
#include "mylib.h"
}