github 上找到一个开源库,要怎么编译成 dll 使用...

小卡拉米 2020-12-28 08:04:02
github 上找到一个开源库,要怎么编译成 dll 使用... Windows 平台使用 VS2019
求教

https://github.com/beltoforion/muparser

里面有CMakeList.txt ,我 用cmake 命令运行了一下,生了一堆文件

然后要怎么做?
...全文
1818 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
小卡拉米 2020-12-31
  • 打赏
  • 举报
回复
知道原因了, 是我在 cmake 的时候, 可以设置平台架构:

cmake -G "Visual Studio 16 2019" -A Win32 CMakeLists.txt
这样生成的项目文件就是Win32 平台了
小卡拉米 2020-12-30
  • 打赏
  • 举报
回复
引用 8 楼 管理員 的回复:
引用 2 楼 qq_40162781 的回复:
有些会让执行cmake的时候键入一些选项,让你选择构建静态库还是动态库
请问你知道如何把这个库编译成 x86的 dll 吗?现在编译出来的是x64的
我cmake 以后,生成的项目文件用 VS2019打开,只能编译成 x64,没有 x86可以选
引用 9 楼 qq_40162781 的回复:
引用 8 楼 管理員 的回复:
引用 2 楼 qq_40162781 的回复:
有些会让执行cmake的时候键入一些选项,让你选择构建静态库还是动态库
一般vs里调成32位就行了
这个我知道,但只有 x64, 没有 x86可选。我自建项目是有 x64和 x86可以选的
qq_40162781 2020-12-30
  • 打赏
  • 举报
回复
引用 8 楼 管理員 的回复:
引用 2 楼 qq_40162781 的回复:
有些会让执行cmake的时候键入一些选项,让你选择构建静态库还是动态库
一般vs里调成32位就行了
小卡拉米 2020-12-30
  • 打赏
  • 举报
回复
引用 2 楼 qq_40162781 的回复:
有些会让执行cmake的时候键入一些选项,让你选择构建静态库还是动态库
请问你知道如何把这个库编译成 x86的 dll 吗?现在编译出来的是x64的
小卡拉米 2020-12-30
  • 打赏
  • 举报
回复
解决了。。。VS2019 右键项目属性 》配置属性 》高级》字符集,本来是使用Unicode字符集,要选择“使用多字节字符集”才行。。。
qq_40162781 2020-12-29
  • 打赏
  • 举报
回复
有些会让执行cmake的时候键入一些选项,让你选择构建静态库还是动态库
qq_40162781 2020-12-29
  • 打赏
  • 举报
回复
然后在vs里进行编译。github上的项目一般都会有教你怎么构建的吧
小卡拉米 2020-12-29
  • 打赏
  • 举报
回复
引用 5 楼 qq_40162781 的回复:
[quote=引用 4 楼 管理員的回复:]
cl test.cpp /LD muparser.dll
还会提示 dll 无效。但是生成的例子都可以运行的啊,example.exe

/out:test.dll
/dll
/implib:test.lib
test.obj
muparser.dll
muparser.dll : fatal error LNK1107: 文件无效或损坏: 无法在 0x370 处读取
库计算机类型“x64”与目标计算机类型“x86”冲突 这个报错很明显了。你编译出来的动态库是64位程序,你的代码是32位就冲突了,你把你的代码改成64位就可以了[/quote] 是了,谢谢。但我用了64位,用它官网的示例代码 ,还是运行不了,什么垃圾啊。。。一直报字符类型不匹配

#include <iostream>
#include "muParser.h"

double MySqr(double a_fVal) { return a_fVal * a_fVal; }

int main(int argc, char* argv[])
{
	try
	{
		double var_a = 1;
		mu::Parser p;
		mu::string_type(wchar_t("a"));
		p.DefineVar("a", &var_a);
		p.DefineFun("MySqr", MySqr);
		p.SetExpr(std::basic_string<std::string>("MySqr(a)*_pi+min(10,a)"));

		for (std::size_t a = 0; a < 100; ++a)
		{
			var_a = a;  // Change value of variable a
			std::cout << p.Eval() << std::endl;
		}
	}
	catch (mu::Parser::exception_type& e)
	{
		std::cout << e.GetMsg() << std::endl;
	}

	return 0;
}
qq_40162781 2020-12-29
  • 打赏
  • 举报
回复
引用 4 楼 管理員的回复:
cl test.cpp /LD muparser.dll
还会提示 dll 无效。但是生成的例子都可以运行的啊,example.exe

/out:test.dll
/dll
/implib:test.lib
test.obj
muparser.dll
muparser.dll : fatal error LNK1107: 文件无效或损坏: 无法在 0x370 处读取
库计算机类型“x64”与目标计算机类型“x86”冲突 这个报错很明显了。你编译出来的动态库是64位程序,你的代码是32位就冲突了,你把你的代码改成64位就可以了
小卡拉米 2020-12-29
  • 打赏
  • 举报
回复
cl test.cpp /LD muparser.dll
还会提示 dll 无效。但是生成的例子都可以运行的啊,example.exe

/out:test.dll
/dll
/implib:test.lib
test.obj
muparser.dll
muparser.dll : fatal error LNK1107: 文件无效或损坏: 无法在 0x370 处读取
小卡拉米 2020-12-29
  • 打赏
  • 举报
回复
引用 2 楼 qq_40162781 的回复:
有些会让执行cmake的时候键入一些选项,让你选择构建静态库还是动态库
是的,vs 里编译一下就生成了 dll, lib 这些。 然后我写了一个 cpp文件,与生成的 dll 文件同目录

#include "muParser.h"
#include "stdlib.h"
using namespace mu;
int main()
{
    double var_a = 1;
    mu::Parser p;
    p.SetExpr("3*3+1-2");
    std::cout << p.Eval();
}
始终编译不成功:

cl test.cpp 

test.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: doub
le __thiscall mu::ParserBase::Eval(void)const " (__imp_?Eval@ParserBase@mu@@QBEN
XZ),函数 _main 中引用了该符号
test.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: void
 __thiscall mu::ParserBase::SetExpr(class std::basic_string<char,struct std::cha
r_traits<char>,class std::allocator<char> > const &)" (__imp_?SetExpr@ParserBase
@mu@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),函
数 _main 中引用了该符号
test.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __th
iscall mu::Parser::Parser(void)" (__imp_??0Parser@mu@@QAE@XZ),函数 _main 中引用
了该符号
test.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virt
ual __thiscall mu::Parser::~Parser(void)" (__imp_??1Parser@mu@@UAE@XZ),函数 _ma
in 中引用了该符号
muparser.lib : warning LNK4272:库计算机类型“x64”与目标计算机类型“x86”冲突
test.exe : fatal error LNK1120: 4 个无法解析的外部命令

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧