makefile生成动态库(萌新求助、gcc编译c++动态库编写makefile)

本文目录
- 萌新求助、gcc编译c++动态库编写makefile
- Solaris下如何编译生成动态库
- openssl怎么编译成动态库
- cmake:让mingw(gcc)生成MSVC可用的dll(.lib)----mark亲测有效
萌新求助、gcc编译c++动态库编写makefile
假设有下面几个c++文件:
wherewhen.h wherewhen.c
countdown.h countdown.c 包含了math.h, 需要连接库文件
main.c 主函数, main.c 包含了两个头文件 wherewhen.h and countdown.h
1、第一种编译方法:
g++ -Wall -g wherewhen.c countdown.c main.c -lm -o myprogram
生成可执行文件myprogram
2、第二中编译方法, 分别编译各个文件:
g++ -Wall -g -c wherewhen.c
g++ -Wall -g -c countdown.c
g++ -Wall -g -c main.c
g++ -g wherewhen.o countdown.o main.o -lm -o myprogram
Solaris下如何编译生成动态库
解决编译问题或者做补丁时需要更新文件,然后单独编译某个工程,生成相应的动态库,Windows下界面操作可以很方便的实现编译相应的工程,生成.dll文件,而Solaris下是命令行操作,编译生成的动态库为.so格式,主要有以下几个步骤:
1.更新
a.更新文件夹
cd到文件夹所在目录,执行如下命令行
cleartool update -ove 文件夹名
例如:cd /......../server/include
Cleartool update –ove foldername
完成对文件夹foldername的更新
b.更新文件
cd到文件所在目录,执行如下命令行
cleartool update -ove ./文件名
例如:cd /.../include/
cleartool update –ove filename.h
完成对文件filename.h的更新
2.编译
更新完毕后需要重新编译生成新的动态库
a.首先cd到makefile文件夹下
例如:cd /..../makefile
b.执行环境变量
. ./setenv.sh
c.编译相应的makefile文件
gmake –f makefile文件
例如:gmake –f makefilename.makefile
完成对makefilename.makefile的编译。
生成的动态库目录:
/.../server/lib/release
openssl怎么编译成动态库
Windows下编译OpenSSL动态库的方法:
1、安装ActivePerl
初始化的时候,需要使用perl
2、使用VS下的Visual Studio 20xx Command Prompt进入控制台模式
3、解压缩openssl的包,通过cd命令切换到openssl的目录
4、执行:perl configure VC-WIN32
5、执行:ms/do_ms
6、选择不同的编译结果
1) 执行:nmake -f ms/ntdll.mak
该命令生成动态库,默认使用的是MD
2) 执行:nmake -f ms/nt.mak
该命令生成静态库,默认使用的是MT
3) 想生成使用静态链接运行时库的动态库则采用下面方法
复制一个ntdll.mak并命名为ntdll_mt.mak,修改里面的 “CFLAG= /MD /Ox ..............” 为/MT ,然后重新编译,执行 nmake -f ms/ntdll_mt.mak
4) 想生成使用动态链接运行时库的静态库则采用下面方法
复制一个nt.mak并命名为nt_md.mak,修改里面的 “CFLAG= /MT /Ox ..............” 为/MD ,然后重新编译 ,执行 nmake -f ms/nt_md.mak
7.其它命令:
nmake -f ms/ntdll.mak clean // 清除编译的中间文件
nmake -f ms/ntdll.mak install // 安装 ,主要是linux下面会自动放到程序目录中 。
cmake:让mingw(gcc)生成MSVC可用的dll(.lib)----mark亲测有效
minggw(gcc)编译出来的动态库(DLL),默认是没有MSVC连接动态库所需要的lib文件的。
关于MSVC的DLL和LIB的作用和区别,请参考这篇博文,讲得很透彻了–》《DLL和LIB的区别》
那么如果VC要链接gcc生成的DLL,却没有lib文件怎么办?
对于这个问题网上都有解决的办法,这篇文章讲到一些办法,可供收藏《VC6 调用GCC的DLL》,对于没有提供lib的DLL都可以用这篇文章提供的办法试试。
如果项目中不同的模块用不同的编译器编译,这时如果gcc编译的DLL没有import library(lib文件),可以通过cmake设置选项来解决。
CMAKE有一个GNUtoMS参数就是解决这个问题的。
GNUtoMS
Convert GNU import library (.dll.a) to MS format (.lib).
When linking a shared library or executable that exports symbols using GNU tools on Windows (MinGW/MSYS) with Visual Studio installed convert the import library (.dll.a) from GNU to MS format (.lib). Both import libraries will be installed by install(TARGETS) and exported by install(EXPORT) and export() to be linked by applications with either GNU- or MS-compatible tools.
CMAKE_GNUtoMS
Convert GNU import libraries (.dll.a) to MS format (.lib).
This variable is used to initialize the GNUtoMS property on targets when they are created. See that target property for additional information.(这个变量用来初始化GNUtoMS属性)
在用cmake生成Makefile时,设置GNUtoMS就可以解决这个问题。有两种途径:
shell命令行方式
如下在命令行中-D定义一个为bool类型的CMAKE_GNUtoMS参数为ON,就指示在编译时对dll生成.lib的import library
cmake %source_folder% -G “Eclipse CDT4 - MinGW Makefiles” -DCMAKE_GNUtoMS:BOOL=ON
cmak-gui
如下在cmake-gui界面中将CMAKE_GNUtoMS选项勾选,再点《generate》按钮生成Makefile
这里写图片描述
然后执行make编译项目的过程中,生成dll时会输出(前提是你安装了VC编译器)
Setting environment for using Microsoft Visual Studio 2010 x64 tools.
Microsoft (R) Library Manager Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.
正在创建库 libturbojpeg.lib 和对象 libturbojpeg.exp
编译完成后,你就会发现所有的dll都有对应的lib文件了。
***隐藏网址***

更多文章:
delphi数据库案例(请提供一个简单的DELPHI查询数据库的实例,包括所有操作)
2026年4月19日 13:00
ui培训学校排名(请问:惠州UI培训学校排名比较靠前的有哪些)
2026年8月23日 10:15
学生座位随机数生成器(用excel随机排座位号码不要重复的)
2025年6月14日 13:30
用solidworks画大白(大神们这个用solidworks怎么画)
2026年4月17日 21:30
apache恢复默认配置(配置php以后,重启Apache,配置失效了,但重启电脑以后又好了,怎么)
2026年9月5日 07:45
onmousemove怎么停止(js的onmousemove)
2025年8月2日 16:45
三角函数值对照表全部初中(特殊角度的三角函数值是怎么样的呢)
2026年1月3日 15:15















