cmake cpp 函数导出
时间: 2023-07-09 17:38:33 浏览: 51
在 C++ 中,可以使用 `extern "C"` 声明函数,以便在 C++ 中以 C 样式进行导出,这样可以使其在动态链接库中被正确地导出。
在 CMake 中,可以使用 `add_library` 命令来创建动态链接库,例如:
```cmake
add_library(mylib SHARED mylib.cpp)
```
如果要导出某个函数,可以在函数声明前加上 `extern "C"`,如下所示:
```cpp
extern "C" int myfunc(int arg1, int arg2);
```
然后在 CMakeLists.txt 中使用 `target_link_libraries` 命令将库链接到可执行文件中,如下所示:
```cmake
add_executable(myexe main.cpp)
target_link_libraries(myexe mylib)
```
这样,myfunc 函数就可以在 mylib 中被正确地导出,可以在其他程序中使用。
相关问题
封装一个cmake函数,能够自动导出当前模块的库和头文件的相对位置信息,并提供版本信息
好的,可以使用以下的CMake函数来实现:
```cmake
# 定义函数 export_module
function(export_module MODULE_NAME MODULE_VERSION)
# 设置库文件输出路径
set(EXPORT_LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib)
# 创建库文件输出路径
file(MAKE_DIRECTORY ${EXPORT_LIB_DIR})
# 设置头文件输出路径
set(EXPORT_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
# 创建头文件输出路径
file(MAKE_DIRECTORY ${EXPORT_INCLUDE_DIR})
# 设置库文件名
set(EXPORT_LIB_NAME ${MODULE_NAME})
# 添加库文件输出路径到 CMake 变量中
set(${MODULE_NAME}_LIBRARY_DIRS ${EXPORT_LIB_DIR} CACHE INTERNAL "")
# 添加头文件输出路径到 CMake 变量中
set(${MODULE_NAME}_INCLUDE_DIRS ${EXPORT_INCLUDE_DIR} CACHE INTERNAL "")
# 添加库文件名到 CMake 变量中
set(${MODULE_NAME}_LIBRARIES ${EXPORT_LIB_NAME} CACHE INTERNAL "")
# 导出版本信息
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/version.h.in"
"${EXPORT_INCLUDE_DIR}/version.h"
@ONLY
)
# 设置源文件编译选项
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# 编译库文件
add_library(${EXPORT_LIB_NAME} SHARED ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# 设置库文件输出路径
set_target_properties(${EXPORT_LIB_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${EXPORT_LIB_DIR})
# 导出头文件
file(GLOB_RECURSE EXPORT_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
foreach(EXPORT_HEADER ${EXPORT_HEADERS})
file(RELATIVE_PATH HEADER_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include ${EXPORT_HEADER})
get_filename_component(HEADER_DIR ${HEADER_PATH} DIRECTORY)
set(EXPORT_HEADER_DIR ${EXPORT_INCLUDE_DIR}/${HEADER_DIR})
file(MAKE_DIRECTORY ${EXPORT_HEADER_DIR})
configure_file(
${EXPORT_HEADER}
${EXPORT_HEADER_DIR}/${HEADER_PATH}
COPYONLY
)
endforeach()
# 添加库文件和头文件的相对路径到 CMake 变量中
foreach(EXPORT_HEADER_DIR ${EXPORT_INCLUDE_DIR})
get_filename_component(EXPORT_HEADER_DIR_NAME ${EXPORT_HEADER_DIR} NAME)
set(${MODULE_NAME}_INCLUDE_DIRS ${${MODULE_NAME}_INCLUDE_DIRS} ${EXPORT_HEADER_DIR_NAME} CACHE INTERNAL "")
endforeach()
set(${MODULE_NAME}_LIBRARY_DIRS ${${MODULE_NAME}_LIBRARY_DIRS} "." CACHE INTERNAL "")
endfunction()
```
该函数会自动将当前模块的库文件和头文件导出到指定的输出路径,并提供版本信息。函数的参数包括模块名称和模块版本。使用时,只需要调用该函数,并传入对应的参数即可。
例如,假设当前模块的名称为 my_module,版本为 1.0.0,则可以使用以下代码来导出模块:
```cmake
# 调用 export_module 函数
export_module(my_module 1.0.0)
# 添加库文件和头文件搜索路径
include_directories(${my_module_INCLUDE_DIRS})
link_directories(${my_module_LIBRARY_DIRS})
# 编译当前模块的测试代码
add_executable(test_my_module test.cpp)
target_link_libraries(test_my_module ${my_module_LIBRARIES})
```
在该例子中,我们调用了 export_module 函数来导出 my_module,然后将其库文件和头文件的搜索路径添加到 CMake 中,最后编译了一个测试程序并链接 my_module 库。
cmake编译通过EMSCRIPTEN_BINDINGS导出c函数的WebAssembly项目生成.js与.wasm文件,使用cmake3.0与c++11
首先,确保你的项目已经正确地链接了 Emscripten SDK。接下来,在 CMakeLists.txt 中添加以下内容:
```cmake
cmake_minimum_required(VERSION 3.0)
project(your_project)
# 设置编译选项
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# 添加 Emscripten 编译器
SET(CMAKE_C_COMPILER "emcc")
SET(CMAKE_CXX_COMPILER "em++")
# 添加 Emscripten 编译选项
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1 -s USE_SDL=2 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_GLFW=3")
# 添加源代码
add_executable(your_project main.cpp)
# 导出 C 函数为 JavaScript 模块
set_target_properties(your_project PROPERTIES LINK_FLAGS "-s EXPORTED_FUNCTIONS='[\"_your_c_function\"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'")
# 指定输出文件名
set_target_properties(your_project PROPERTIES OUTPUT_NAME "your_project")
# 指定输出文件类型为 JavaScript 模块
set_target_properties(your_project PROPERTIES SUFFIX ".js")
# 拷贝输出文件到指定目录
add_custom_command(TARGET your_project POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:your_project> ${CMAKE_CURRENT_SOURCE_DIR}/output/)
```
以上代码做了以下几件事:
1. 设置编译选项,包括编译标准、编译器等等。
2. 添加 Emscripten 编译器和编译选项。
3. 添加源代码。
4. 导出 C 函数为 JavaScript 模块,这里的 `_your_c_function` 是你需要导出的函数名。
5. 指定输出文件名为 `your_project.js`。
6. 拷贝输出文件到指定目录。
最后,你可以通过以下命令来生成 WebAssembly 项目:
```bash
mkdir build && cd build
cmake ..
make
```
如果一切顺利,你将得到 `your_project.js` 和 `your_project.wasm` 两个文件,其中前者是 JavaScript 模块,后者是 WebAssembly 模块。