C++ CMake won';t将C库链接到C++;程序
可能是我能想到的最短的工作示例: CMakeLists.txt: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
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不进行链接