CMake不会将C库链接到C ++程序

时间:2015-12-22 03:43:41

标签: c++ c cmake dynamic-linking

可能是我能想到的最短的工作示例:

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

系统:

  • Ubunto 15.10
  • gcc 5.2.1 / clang 3.6.2(试过两个)
  • CMake 3.2.2

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

1 个答案:

答案 0 :(得分:14)

您需要在c ++中使用extern "C"声明个函数。 编译器更改函数名称以允许函数重载,例如

int function(int value);

int function(char *value);

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

中,您无法执行此操作,并且不需要修改函数名称。通过使用extern "C"可以防止编译器更改函数名称,因此链接阶段将按预期工作。

要修复它,请以这种方式启动main.cpp:

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