C++ CMake won';t将C库链接到C++;程序

C++ CMake won';t将C库链接到C++;程序,c++,c,cmake,dynamic-linking,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

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

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)
#ifndef MYLIB_H
#define MYLIB_H

void doit(void);

#endif
#include "mylib.h"
#include <stdio.h>

void doit(void)
{
  printf("doit");
}
main.c/main.cpp(内容相同):

mylib.h

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)
#ifndef MYLIB_H
#define MYLIB_H

void doit(void);

#endif
#include "mylib.h"
#include <stdio.h>

void doit(void)
{
  printf("doit");
}
mylib.c

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)
#ifndef MYLIB_H
#define MYLIB_H

void doit(void);

#endif
#include "mylib.h"
#include <stdio.h>

void doit(void)
{
  printf("doit");
}
#包括“mylib.h”
#包括
void doit(void)
{
printf(“doit”);
}
系统:

  • Ubto 15.10
  • gcc 5.2.1/clang 3.6.2(两者都试过)
  • CMake 3.2.2
当我执行
make myprog
时,
myprog
的链接阶段抱怨有一个未定义的对
doit
的引用。但是,如果我使用
makemyprog2
,则所有内容都会正确链接,程序会按预期运行

<>我不明白为什么CMake没有正确地链接到C++程序中的<代码> MyLIB < /C>。从编译器提供的详细输出中获取(我已经修剪了一些到系统库路径/对象文件的链接):

“/usr/bin/ld”-导出动态--eh-frame hdr-m elf_x86_64-dyna mic linker/lib64/ld-linux-x86-64.so.2-o myprog-CMakeFiles/myprog.dir/main.cpp.olibmylib.so-rpath/home/andrew/code/misc/myprog/build-lstdc++-lm-lgcc_s-lgcc-lc-lgcc_s-lgcc

奇怪的是,它没有使用
-lmylib
链接mylib。对于
myprog2
,我得到了类似的输出

我的问题是为什么会发生这种情况,更重要的是,我如何得到<代码> MyPROG正确链接到<代码> MyLIB < /C> >?/P> < P>你需要用C++来声明函数,使用代码>外部“C”< /C> >。编译器更改函数名以允许函数重载,例如

int function(int value);

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

在中,您不能这样做,并且不需要修改函数名。通过使用
extern“C”
可以防止编译器更改函数名,因此链接阶段将按预期工作

要修复此问题,请按以下方式启动main.cpp:

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

隐马尔可夫模型。。。这是有道理的,但是为什么我不需要用
extern“C”
包装系统C库(或者我应该并且到目前为止一直很幸运吗?)例如,我搜索了GTK+3.0标题,却没有提到
extern“C” >我不做我的C++代码中的包装。@ HyLoRLD922——因为大多数包含的文件都包含了诸如“C++”、“代码”>“IFDEF”、“CPLUS PLUS”、“代码”、“代码>外部”C“{ /代码”和“代码>”“NEXF ”。您使用的是GTK-3.0的C++代码吗?还是GTKMM3.0?不是GTKMM3.0,而是GTK-3.0。(是的,我可能应该使用gtkmm,但在过去我遇到了gtkmm在功能方面落后于gtk的问题。)我刚刚确认了你所说的,有
extern“C”
,它是一个名为
G\u BEGIN\u DECLS
defind in/usr/include/glib-2.0/glib/gmacros.h的宏,即
extern“C”{
,当然必须与相应的
G_END_DECLS
匹配。问题不在于CMake,而是链接器。CMake不进行链接