首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

cmake:动态链接库(so)中静态链接tcmalloc(gperftools2.4)暨静态链接libstdc++

将tcmalloc作为动态使用,非常方便,网上有很多资料介绍了。...tcmalloc.a也可以以静态链接的方式加入应用程序中,大概因为使用太方便,网上关于这方面的介绍都是一笔带过,但是如果要在动态 库(so)中静态编译tcmalloc,却是有所不同的。...使用这种方案,我的so库代码不需要在编译链接tcmalloc,什么都不用改变,就能使用tcmalloc。...(so的代码是以C++11写的,所以还要依赖于libstdc++库,所以我打算把libstdc++库也以静态方式连接到程序中) ##判断操作系统类型 if(CMAKE_SYSTEM_NAME MATCHES...总结 如果在可执行程序中静态链接tcmalloc,用默认参数编译tcmalloc就好了,无需带-fPIC参数, 但是在动态库(so)中静态链接tcmalloc,必须要用-fPIC重新编译tcmalloc

1.9K10
您找到你想要的搜索结果了吗?
是的
没有找到

cmake链接静态库-static-libstdc++问题

在嵌入式平台中,业务使用C语言开发,在交叉编译过程中会链接一个第三方的c++静态库,该第三放库使用了std,需要链接libstdc++的库,由于所在的嵌入式平台中没有libstdc++.so库,如果将libstdc...++.so拷贝板子上,需要占用5MB空间,很浪费空间,准备使用libstdc++的静态库,在链接过程中出现如下问题;   整个业务的编译使用cmake构建,使用如下方式进行链接; add_executable...} ${src_sample}) target_link_libraries(${target}  -lstdc++) 可以编译成功,但此时链接的是stdc++动态库,与预期相违背; 经过漫长的资料查阅终于找到原因...'lstdc++'是gcc和g++都能识别,但是'-static-libstdc++'只有g++可以识别,而我的业务代码都是使用C语言编写的,在链接cmake默认使用的是gcc,但是gcc不能识别'-...static-libstdc++',最终不会链接到实际的libstdc++.a,所以在链接出现不能识别std的问题; 知道原因了,就很好解决了,在链接阶段将cmake链接选项改为g++即可,添加如下一行就可以正常链接成功

6K51

创建动态,建议使用链接选项Bsymbolic

问题描述 回归正题,前段时间项目开发中,实现了一个动态库,封装了一些方法。然后基于这个动态库,实现了一个应用程序。...应用程序中含有全局变量A,动态库中也含有全局变量A,当我调用动态库中函数后,发现应用程序的A发生了变化!!!O,My God!对于我这种还没在Linux下做过开发的人来说,一头雾水。。。。。。...于是我尝试着,将A中的变量名称改为B,这样问题也就没有了~~~ 原因 应用程序进行链接的时候,动态库中全局变量定义,将会被应用程序中同名的全局变量所覆盖。...这样也就造成了,在动态库中修改A变量,应用程序中的A也发生了变化。 解决方法 在创建动态链接,gcc/g++选项中添加编译选项 -Wl,-Bsymbolic....Bsymbolic表示强制采用本地的全局变量定义,这样就不会出现动态链接库的全局变量定义被应用程序/动态链接库中的同名定义给覆盖了!

1.6K10

GO 使用 动态链接库(共享链接库)进行编译 生成动态链接可执行文件

我们使用 go help buildmode 可以看到 go 可以以多种方式进行构建,默认使用静态链接库. ➜ src go help buildmode The 'go build' and 'go...buildmode=shared std 创建yxpkg包的 so库: root@docker ~/go# go install -buildmode=shared -linkshared yxpkg 编译...main.go 生成动态链接的可执行文件: root@docker ~/g/src# go build -linkshared yaoxu.go 我们对比之前生成的静态链接的可执行文件:发现其可执行文件大小...可见,两个文件一个是动态链接文件,一个是静态链接文件。 其中需要注意的是,go进行动态链接编译的时候,还是需要源代码文件辅助编译,我想主要是构建符号表的原因。...还有一些具体的细节,你可以配置自己的环境,自行进行测试; 编译后的工作区的目录结构如下: ?

3.3K20

关于 CMake CMAKE_EXE_LINKER_FLAGS 选项的小坑

找不到 libwinpthread-1.dll 其实之前我用 VSCode 的时候也遇到了,只需要将 libstdc++ 和 libgcc 静态链接就行了,谁知 CMake 在处理 -dynamic 编译器标志的方式方面做得很奇怪...,使得 -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic 解决方案不起作用: set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc...-static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic") 实际上在 CMake 中有效的是直接使用链接器标志, 因此在 CMake...查了一下发现, CMAKE_EXE_LINKER_FLAGS 这个变量好像就没几个人用, 网上普遍建议的是使用 target_link_libraries 的写法,注意 target_link_libraries...当然,也可以直接简单粗暴 -static 全静态编译(不推荐),那就啥事没有了 set(CMAKE_EXE_LINKER_FLAGS "-static") 看来以后还是少从网上扒不靠谱代码,现在这个年代说方便也方便

9.3K20

重写了llvm+clang+libc++和libc++abi的构建脚本

目测3.9.0版本的问题是开启动态库的编译模式以后有些子工程还是静态库,并且会漏掉加-fPIC,即便我在cmake的选项里加了也没用。...然后有新的选项是把编译出来的各种.a都动态链接到一起(我试了下保留Debug信息的话这个libLLVM.so有900MB)。所以干脆不保留Debug信息了。...第二次自举编译完成后,不再依赖libstdc++,转而依赖编译出来的libc++和libc++abi,但是仍然会依赖libgcc_s.so llvm内部分组件没有使用LIBCXX_LIBCXXABI_INCLUDE_PATHS...来查找c++abi的头文件,故而编译的时候直接把这个目录加到了C_INCLUDE_PATH里 使用动态库,原先使用静态库会导致编译出来的二进制非常大,现在全部使用动态库 CentOS 7下测试默认包...(无论如何-lc++abi都要手动加链接符号) 如果使用clang -stdlib=libstdc++则需要加上-lstdc++的链接选项,或者使用clang++ -stdlib=libstdc++

2.1K20

【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 1 ....博客资源 参考博客 : 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库...CMake 引入动态库 : 使用 set() , 指定一个 CMAKE_CXX_FLAGS 编译器参数 , 在编译器参数后添加 -L 参数指定动态库查找目录 ; # 设置变量 # CMAKE_CXX_FLAGS...CMake 构建脚本 CMakeList.txt 链接静态库 : # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库目 标 # 参数 2 ~ ... : 后面是之前预编译动态库或静态库...C+= 参数给编译 , 在 该参数后面指定库的路径 # CMAKE_SOURCE_DIR 指的是当前的文件地址 # -L 参数指定动态库的查找路径 set(CMAKE_CXX_FLAGS

8.9K20

Develop with OpenCV on Mac

如果只是需要OpenCV的相关头文件以及动态库,请直接执行brew install opencv(如果安装了Homebrew的话),如果不行,请看下面的OpenCV源码编译安装过程。...1.安装CMake 安装CMake可以使用MacPorts,也可以使用Homebrew,如果以前安装过两者中的任何一个就用那个进行安装吧,我用的是Homebrew,推荐使用Homebrew,真正的“佳酿...”,命令如下: sudo port install cmake //macports sudo brew install cmake //homebrew 2.编译OpenCV OpenCV下载地址:http...sudo make install [完成之后在/usr/local/include目录下便有了opencv和opencv2两个目录,在/usr/local/lib目录下有很多的opencv相关的动态库...,详情看后面] 其他参考内容: Building OpenCV from Source Using CMake, Using the Command Line Installing OpenCV 3.使用

79620

LLVM+Clang+Libcxx+Libcxxabi(3.6)工具链编译(完成自举编译

的源代码 编译过程改成了两次编译 编译过程完全使用cmake。...终于自举编译成功啦,第二次自举编译完成后,不再依赖libstdc++,转而依赖编译出来的libc++和libc++abi,但是仍然会依赖libgcc_s.so 多线程编译的时候时不时会出现奇怪的失败,...所以默认改成单线程编译 修复编译完成后的提示输出 NOTICE 由于生成动态库会出现一些问题,所以目前都是采用llvm默认的静态链接的方式。...这时候可以通过手动cd到编译目录,执行 make && make install 即可 编译安装 LLVM + Clang 3.6 准备环境及依赖项 cmake Python python-devel...默认采用动态链接,默认关闭LLDB编译(各种链接问题,解决不了,反正已经支持gdb了就用gdb吧) 参考文献 llvm官网 Linux下编译clang、libcxx及其相关库——C++11环境搭建

1.8K10

CMake搭建编译环境总结

编译警告 CMake编译警告和报错设置 常用警告 配置交叉编译环境常需要的修改 设置默认库和头文件搜索路径 设置交叉编译工具链 设置浮点运算处理方式 常见场景 编译动态编译静态库 编译可执行文件...在配交叉编译工具,此处应写对应交叉编译工具链的绝对路径。...-Wempty-body 当存在空的if、else或者do while语句发出警告 -Wunused-parameter 当函数有未被使用的参数发出警告,需配合-Wall -Wunused-but-set-parameter...当存在被设置但是未被使用的参数发出警告,需配合-Wall -Wsign-compare 当比较有符号和无符号值发出警告 配置交叉编译环境常需要的修改 设置默认库和头文件搜索路径 编译默认会从/usr...") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard -mfpu=neon") 常见场景 编译动态库 ## 生成libtest.so

2.3K20

Milvus 编译环境演进

一、手写动态链接 Milvus 代码库分为了 C++ 和 Go 两个部分,Go 部分负责系统主体架构、分布式系统、存储/查询链路等,C++ 部分负责查询、索引引擎专注于单机场景下的高性能,两者之间通过...不同操作系统需要指定不同的编译参数 2. hard code 库文件路径耦合严重,不利于维护 以上两个问题相对容易解决,在使用第三方 go library ,问题会更难解决,例如 Milvus 使用了...gorocksdb 需要修改 CGO 的一系列 go env 才能编译成功,究其原因也是因为 gorocksdb 在使用 rocksdb library 没有指定 library 和 header 的路径...在 Milvus 里需要做三个改造: 一是在 C++ 生成动态链接库的同时生成 pkg-config 的 .pc 文件。...C++ 编译受操作系统、编译器类型、C++ 版本、libstdc++ 版本的影响很大,这些变量交织在一起会产生很多意想不到的错误,这里把遇到的一些问题整理一番。 1.

1.4K30

【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )

CMake 构建脚本 CMakeList.txt 链接静态库 : # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库目 标 # 参数 2 ~ ... : 后面是之前预编译动态库或静态库...特别注意 : 使用这种方法引入动态库 , 在 6.0 以上的系统是无法使用的 , 推荐使用 set() 设置 -L 参数的方式引入动态库 ; # 设置变量 # CMAKE_CXX_FLAGS 表示会将...C++ 的参数传给编译器 # CMAKE_C_FLAGS 表示会将 C 参数传给编译器 # 参数设置 : 传递 CMAKE_CXX_FLAGS C+= 参数给编译 , 在 该参数后面指定库的路径...链接函数库 ---- 链接函数库 : 这里注意第一个参数必须是要生成的动态库模块 ; # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库目标 # 参数 2 ~ ... :...表示会将 C++ 的参数传给编译器 # CMAKE_C_FLAGS 表示会将 C 参数传给编译器 # 参数设置 : 传递 CMAKE_CXX_FLAGS C+= 参数给编译 , 在 该参数后面指定库的路径

2.5K40

【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态编译配置 | JNI 头文件导入 | JNI 方法命名规范 )

Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edition 创建 Java 项目 V ....CMake 项目生成 dll 动态库 VIII . Java 中加载调用动态库 IX . 使用 javah 工具生成 C++ 中需要实现的 Native 方法 ( 仅做参考 ) X . 总结 I ....Visual Studio 编译动态库 ---- 前提 : 需要搭建 Visual Studio 的 CMake 开发环境 ; 【Visual Studio】Visual Studio 2019 社区版...⑥ 生成动态库 : 使用 “Ctrl + Shift + B” 快捷键 , 编译项目 , 即可生成动态库 ; ⑦ 查看动态库 : 在项目的 “项目根目录\out\build\x64-Debug\009_...生成动态库 : 使用 “Ctrl + Shift + B” 快捷键 , 编译项目 , 即可生成动态库 ; 4 .

1.8K30

从Xcode10不再支持libstdc++说起

某个静态库如果以前是依赖于libstdc++库中的代码,那么这个静态库在Xcode10中被链接将会报符号找不到的链接错误信息:Undefined symbols for architecture XXX...因此当在源代码中使用这些关键字,在编译阶段就会转化为对如下函数的调用: extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_throw(...可这个问题却不会发生在不同版本的C++标准库:libstdc++和libc++中,你可以在程序中同时依赖这两个库,而不会产生编译链接错误。...上述的内联命名空间的访问只是在编译是没有问题的,但是在链接这个阶段是不会认内联命名空间的,链接阶段只认被修饰过后的符号,也就是在链接阶段是没有内联命名空间这个概念的。...虽然在编译链接不会报错正常编译通过,但是在运行时就可能会出现崩溃的问题,尤其是当你的静态库中将某个老的C++标准库中类的对象作为接口或者函数参数暴露出来给外界使用时就有可能因为新老版本的数据结构和内部实现的差异而造成运行时的崩溃

2K30

再次重构LLVM+Clang+libcxx+libc++abi+其他相关工具的构建流程

而Clang虽然支持GCC的libstdc++,但是一方面我们写基础性类库还是要优先考虑原生STL库的兼容性,另一方面Clang对libstdc++的支持也不是太好,特别是有些第三方库在这个组合下也是没有适配得很好...builtins runtimes CACHE STRING "") 然后可以指定Stage 2自举编译的设置文件 set(CLANG_BOOTSTRAP_CMAKE_ARGS -C ${CMAKE_CURRENT_LIST_DIR...也可以通过最外层执行 cmake 使用带 BOOTSTRAP_ 前缀的参数指定。...比如我们如果使用自己编译的GCC来进行Stage 1阶段编译,为了保证Stage 1和Stage 2查找的GCC一致,可以通过 cmake [...]...所以我最终使用的设置就是在 Fuchsia-stage2.cmake 的基础上,增加了 llvm-as , llvm-addr2line , llvm-addr2line , llvm-config ,

2K20
领券