CMake 不会将 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");
}
系统:
- Ubunto 15.10
- gcc 5.2.1/clang 3.6.2(两者都试过)
- C拍摄3.2.2
当我执行make myprog
时,myprog
的链接阶段会抱怨存在对doit
的未定义引用。但是,如果我使用make myprog2
,则所有内容都会正确链接,并且程序会按预期运行。
我不明白为什么CMake在C++程序中没有正确地链接到mylib
。从编译器获得详细的输出(我已经修剪了一些到系统库路径/对象文件的链接):
"/usr/bin/ld"-export dynamic--eh frame hdr-m elf_x86_64-dynamic链接器/lib64/ld-linux-x86-64.so.2-o myprog CMakeFiles/myprog.dir/main.cpp.olibmylib.so-rpath/home/andrew/code/misc/myprog/build-lsdc++-lm-lgcc_s-lcc_s-lcc
奇怪的是,它没有使用-lmylib
来链接mylib。我得到了myprog2
的类似输出。
我的问题是为什么会发生这种情况,更重要的是,我如何使myprog
正确链接到mylib
?
您需要在c++中用extern "C"
声明c函数。c++编译器更改函数名以允许函数重载,例如
int function(int value);
和
int function(char *value);
两者都可以用完全相同的名称在c++中定义,编译器将生成两个不同名称的函数,以便正确工作。
在c中,你不能这样做,函数名称也不需要修改。通过使用extern "C"
,可以防止编译器更改函数名,因此链接阶段将按预期工作
要修复它,请以这种方式启动main.cpp:
extern "C" {
#include "mylib.h"
}
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 下面是我为检测链接列表中的循环而制作的代码
- 有了gcc,是否可以链接库,但前提是它存在
- 使用C链接在函数内部创建C++模板
- Visual Studio mkl_link_tool.exe链接错误
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 有人能帮我处理这个链接列表吗?C++