cmake 预编译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cmake 预编译相关的知识,希望对你有一定的参考价值。

参考技术A cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

-DMYSQL_DATADIR=/data/mysql \

-DSYSCONFDIR=/etc \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_MEMORY_STORAGE_ENGINE=1 \

-DWITH_BOOST=/usr/local/boost \

-DWITH_READLINE=1 \

-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \

-DMYSQL_TCP_PORT=3306 \

-DENABLED_LOCAL_INFILE=1 \

-DWITH_PARTITION_STORAGE_ENGINE=1 \

-DEXTRA_CHARSETS=all \

-DDEFAULT_CHARSET=utf8

如何在 CMake 中链接预编译库?

【中文标题】如何在 CMake 中链接预编译库?【英文标题】:How do you link precompiled libraries in CMake? 【发布时间】:2021-06-08 13:31:38 【问题描述】:
# file(COPY $CMAKE_SOURCE_DIR/libs/glew32.lib DESTINATION $PROJECT_BINARY_DIR/libs)
# file(COPY $CMAKE_SOURCE_DIR/libs/libglfw3dll.a DESTINATION $PROJECT_BINARY_DIR/libs)

add_executable($PROJECT_NAME main.cpp)
# libs/glew32.lib
# libs/libglfw3dll.a
# "main.cpp"
# )

target_link_libraries($PROJECT_NAME
libs/glew32.lib
libs/libglfw3dll.a
)

我在这里尝试了所有选项,但最终导致链接错误。我尝试了从 src 编译和使用 glfw 和 glew 提供的所有可用格式。

【问题讨论】:

请显示minimal reproducible example,包括完整的错误消息 我相信这两个库都受 CMake 支持并且已经有了查找器。你可能想用 find_package() 代替这个。 我做了,但由于某种原因使用 find_package 时 emcmake 会中断 【参考方案1】:

我通常首先创建一个 CMake 目标来导入预构建/预编译的库,然后像您通常链接到 CMake 库目标一样使用target_link_libraries。好处是您可以将依赖项控制为 PRIVATE 依赖项或 PUBLIC 依赖项。

project(YourCoolProject)

# Import a prebuilt library to a CMake target
add_library(Foo SHARED IMPORTED)
set_target_properties(Foo PROPERTIES
  IMPORTED_LOCATION_DEBUG   "/absolute-path/to/prebuilt-debug-library"
  IMPORTED_LOCATION_RELEASE "/absolute-path/to/prebuilt-release-library"
  IMPORTED_LOCATION_RELWITHDEBINFO "/absolute-path/to/prebuilt-relwithdebinfo-library"
  INTERFACE_INCLUDE_DIRECTORIES "/absolute-path/to/include-dir"
)

add_executable($PROJECT_NAME main.cpp)
target_link_libraries($PROJECT_NAME PRIVATE Foo)

注意事项:

    IMPORTED_LOCATION_<CONFIG> 的选择取决于您提供给 CMake (cmake -DCMAKE_BUILD_TYPE=<CONFIG> ...) 的构建类型。 为了替换绝对路径,您可以使用find_library利用CMake查找您的库并将其存储在变量中,然后使用find_path查找包含目录。

【讨论】:

【参考方案2】:

您可能还需要使用target_link_directories() 来告诉编译器在哪里可以找到库:

target_link_directories($PROJECT_NAME $PROJECT_BINARY_DIR/libs/)

【讨论】:

以上是关于cmake 预编译的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CMake 中链接预编译库?

在 cmake 中使用预编译的 tensorflow

NDK开发使用cMake方式 - 添加其他的预编译库

在 Windows 下通过 CMake 使用预编译的 HDF5 库

Android Studio外部本机构建预编译头

Win10下vs2015编译OSGEarth2.10