在CMake中链接C和CXX文件

时间:2010-03-08 10:57:52

标签: c++ c linker cmake

我正在使用CMake构建C ++应用程序。但它在C中使用了一些源文件。这是简化的结构:

躯干/的CMakeLists.txt:

project(myapp)
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -g -Wall")
add_subdirectory (src myapp)

躯干/ SRC / main.cpp中:

#include "smth/f.h"
int main() { f(); }

躯干/ SRC /的CMakeLists.txt:

add_subdirectory (smth)
link_directories (smth)    
set(APP_SRC main)
add_executable (myapp ${APP_SRC})
target_link_libraries (myapp smth)

躯干/ SRC /不便/ f.h:

#ifndef F_H
#define F_H
void f();
#endif

躯干/ SRC /不便/ F.C:

#include "f.h"
void f() {}

躯干/ SRC /不便/的CMakeLists.txt

set (SMTH_SRC some_cpp_file1 some_cpp_file2 f)
add_library (smth STATIC ${SMTH_SRC})

问题是:我运行gmake,它编译所有文件,当它将所有库链接在一起时,我得到:

undefined reference to `f()` in main.cpp

如果我将f.c重命名为f.cpp,一切都很顺利。有什么区别以及如何处理它?<​​/ p>

由于

2 个答案:

答案 0 :(得分:15)

将f.h更改为:

#ifndef F_H
#define F_H

#ifdef __cplusplus
extern "C" {
#endif

void f();

#ifdef __cplusplus
}
#endif

#endif

答案 1 :(得分:2)

请为所有C文件添加C保护。有关详细信息,请参阅此link