Соединение C и файлы CXX в CMake

Я создаю приложение C++ с CMake. Но это использует некоторые исходные файлы в C. Вот упрощенная структура:

trunk/CMakeLists.txt:

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

trunk/src/main.cpp:

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

trunk/src/CMakeLists.txt:

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

trunk/src/smth/f.h:

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

trunk/src/smth/f.c:

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

trunk/src/smth/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, все идет очень хорошо. Каково различие и как обработать его?

Спасибо

9
задан vedro so snegom 8 March 2010 в 10:57
поделиться

2 ответа

Измените f.h на:

#ifndef F_H
#define F_H

#ifdef __cplusplus
extern "C" {
#endif

void f();

#ifdef __cplusplus
}
#endif

#endif
16
ответ дан 4 December 2019 в 11:41
поделиться

Пожалуйста, добавьте C guard во все ваши файлы C. Обратитесь к этой ссылке для получения более подробной информации

2
ответ дан 4 December 2019 в 11:41
поделиться