我编写了一个库,我曾经使用自编写的Makefile进行编译,但现在我想切换到cmake.树看起来像这样(我删除了所有不相关的文件):
.
??? include
? ??? animation.h
? ??? buffers.h
? ??? ...
? ??? vertex.h
? ??? world.h
??? src
??? animation.cpp
??? buffers.cpp
??? ...
??? vertex.cpp
??? world.cpp
Run Code Online (Sandbox Code Playgroud)
所以我要做的只是将源代码编译成共享库,然后使用头文件安装它.
我发现的大多数示例都使用一些共享库编译可执行文件,但从不只是一个普通的共享库.如果有人可以告诉我一个使用cmake的非常简单的库,那么我也可以使用它作为一个例子.
我想构建所描述的相同库的静态和共享版本是否有可能让CMake构建同一个库的静态和共享版本?
但是,源代码被编译两次,每个版本一个,这是不必要的.有什么方法可以避免这种情况吗?
目前我有:
add_library(${LIB} SHARED ${${LIB}_srcs})
add_library(${LIB}_static STATIC ${${LIB}_srcs})
Run Code Online (Sandbox Code Playgroud)
为了只需要编译一次,我需要更改什么?仅供参考.我有相同的编译器标志和定义.
所以我正在用两个静态库构建一个共享库.
这个答案说这样做的方法是-Wl,--whole-archive在我的静态库之前插入,然后插入-Wl,--no-whole-archive它们.
那么我目前在cmake中为共享库提供的是:
add_library(wittyPlus SHARED empty.cpp)
target_link_libraries(wittyPlus
${wtdbosqlite}
${WT_LIBRARIES}
${DB_LIBRARIES}
${Boost_LIBRARIES}
app models
)
Run Code Online (Sandbox Code Playgroud)
所以,我需要的是为它加上-Wl,--whole-archive之前app和models,然后-Wl,--no-whole-archive在他们之后(以标准库进口不要被共享库导出).
在CMake中最简单的方法是什么?
另外:所以我想尽可能多地使用标准的cmake东西,这样我就不需要为Windows构建做任何额外的工作,因为CMake会删除平台上不支持的编译器定义.建成.
libc++来自SVN 的最新LLVM 3.3附带一个CMakeLists.txt.我是一个CMake新手,但昨天我研究了足够能够libc++在RHEL 6.4 x86_64主机上建立结账.
另外,我能够添加足够的CPack相关命令CMakeLists.txt来生成一个libcxx-3.3.svn-0.el6.x86_64.rpm.但很可能由于是新手CMake,我无法同时构建静态和共享库.
是.我回顾是否有可能让CMake构建同一个库的静态和共享版本?.但是,add_library我不想使用和枚举所有源文件,而是想使用libc++'s CMakeList.txt- 使用的方法APPEND.
我可以通过替换ON下面的第40行来生成静态库,OFF以构建静态库
40 option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
41
Run Code Online (Sandbox Code Playgroud)
或者我可以保持原样并构建一个共享库.
我还修改了以下几行,例如消除NOT或注释掉第232和233行.但无论我尝试什么,我似乎无法让静态库与共享库一起构建.
232 if (NOT LIBCXX_ENABLE_SHARED)
233 list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_LIBCPP_BUILD_STATIC)
234 endif()
Run Code Online (Sandbox Code Playgroud)
如何调整CMakeList.txt文件以便同时构建文件?
我目前正在尝试使用Windows和MinGW编译动态链接库(用于插件系统).
我使用此命令行编译每个对象:
mingw-g++ -fPIC test.cpp
Run Code Online (Sandbox Code Playgroud)
和使用这一行的图书馆:
mingw-g++ -rdynamic -shared -Wl,-soname,test.so.1 -o test.so test.o
它根本不起作用(使用GCC与Linux,类似的线路工作):fPIC和rdynamic由于某种原因被忽略.在尝试创建库时,它失败了,因为编译器尝试将它与应该被解析的对象链接起来,因为我将它与主二进制文件动态链接.
那你怎么用MinGW编译呢?
谢谢 :) !
Now i create a new project include c++ support in Android Studio 3.2, it has native-lib.cpp naturally, the CMakeLists.txt looks like this:
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp)
Run Code Online (Sandbox Code Playgroud)
now if i build this project, i can find libnative-lib.so in some "debug" directoies, that's OK, but i want static library ie .a files.
Change SHARED to STATIC won't generate …
java-native-interface android cmake static-libraries android-ndk
我正在开发一个相当大的 C++ 项目,我决定将源文件分成不同的模块,以便管理它们更容易一些。但是,我在使用 CMake 将文件链接在一起时遇到了问题。
所以我有两个库,都包含一些 .cpp 和 .h 文件以及一个 main.cpp 文件。该项目的目录结构如下所示:
root
|-- library1
| |-- lib1.cpp
| |-- lib1.h
| `-- CMakeLists1.txt
|
|-- library2
| |-- lib2.cpp
| |-- lib2.h
| `-- CMakeLists2.txt
|
|-- main.cpp
|-- main.h
`-- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
库 2 依赖于库 1,而 main.cpp 依赖于它们两者。 我可以很容易地将 main.cpp 和 main.h 链接在一起,并在 main.cpp 中使用 main.h 中的函数。库 1 和 2 也是如此。
但我无法将库 1 链接到库 2 或其中任何一个链接到我的 main.cpp。我的主文件如下所示:
#include <iostream>
#include "main.h"
#include "lib1.h" // linking error at this line: …Run Code Online (Sandbox Code Playgroud)