如何让 ChaiScript 在 Linux 和 Windows 下使用 CMake 运行?



我正在做一个学生项目,我们想使用 ChaiSript (6.1( 作为脚本语言。我们在 Linux 和 Windows 上使用 CLion 和 CMake。我们也在使用SFML,所以整个事情必须在Windows上使用minGW 7.3.0进行编译。

我在Linux(gcc 9.2.0和c ++ 17(下创建了一个测试项目,并得到以下链接器错误:

/usr/bin/ld: CMakeFiles/ChaiScriptTest.dir/main.cpp.o: in function `chaiscript::detail::Loadable_Module::DLModule::DLModule(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/felix/Workspaces/CLion/ChaiScriptTest/ChaiScript-6.1.0/include/chaiscript/language/chaiscript_posix.hpp:19: undefined reference to `dlopen'
/usr/bin/ld: /home/felix/Workspaces/CLion/ChaiScriptTest/ChaiScript-6.1.0/include/chaiscript/language/chaiscript_posix.hpp:23: undefined reference to `dlerror'
/usr/bin/ld: CMakeFiles/ChaiScriptTest.dir/main.cpp.o: in function `chaiscript::detail::Loadable_Module::DLModule::~DLModule()':
/home/felix/Workspaces/CLion/ChaiScriptTest/ChaiScript-6.1.0/include/chaiscript/language/chaiscript_posix.hpp:34: undefined reference to `dlclose'
/usr/bin/ld: CMakeFiles/ChaiScriptTest.dir/main.cpp.o: in function `chaiscript::ChaiScript_Basic::ChaiScript_Basic(std::shared_ptr<chaiscript::Module> const&, std::unique_ptr<chaiscript::parser::ChaiScript_Parser_Base, std::default_delete<chaiscript::parser::ChaiScript_Parser_Base> >&&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::vector<chaiscript::Options, std::allocator<chaiscript::Options> > const&)':
/home/felix/Workspaces/CLion/ChaiScriptTest/ChaiScript-6.1.0/include/chaiscript/language/chaiscript_engine.hpp:293: undefined reference to `dladdr'
/usr/bin/ld: CMakeFiles/ChaiScriptTest.dir/main.cpp.o: in function `chaiscript::detail::Loadable_Module::DLSym<std::shared_ptr<chaiscript::Module> (*)()>::DLSym(chaiscript::detail::Loadable_Module::DLModule&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/felix/Workspaces/CLion/ChaiScriptTest/ChaiScript-6.1.0/include/chaiscript/language/chaiscript_posix.hpp:44: undefined reference to `dlsym'
/usr/bin/ld: /home/felix/Workspaces/CLion/ChaiScriptTest/ChaiScript-6.1.0/include/chaiscript/language/chaiscript_posix.hpp:48: undefined reference to `dlerror'
/usr/bin/ld: CMakeFiles/ChaiScriptTest.dir/main.cpp.o: in function `std::thread::thread<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<std::function<chaiscript::Boxed_Value ()> > >, chaiscript::Boxed_Value>::_Async_state_impl(std::thread::_Invoker<std::tuple<std::function<chaiscript::Boxed_Value ()> > >&&)::{lambda()#1}, , void>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<std::function<chaiscript::Boxed_Value ()> > >, chaiscript::Boxed_Value>::_Async_state_impl(std::thread::_Invoker<std::tuple<std::function<chaiscript::Boxed_Value ()> > >&&)::{lambda()#1}&&)':
/usr/include/c++/9.2.0/thread:126: undefined reference to `pthread_create'
collect2: Error: ld returned with value 1
make[3]: *** [CMakeFiles/ChaiScriptTest.dir/build.make:84: ChaiScriptTest] Error 1
make[2]: *** [CMakeFiles/Makefile2:76: CMakeFiles/ChaiScriptTest.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:88: CMakeFiles/ChaiScriptTest.dir/rule] Error 2
make: *** [Makefile:140: ChaiScriptTest] Error 2

所有错误都是由于缺少 chaisript_posix.hpp 和 chaiscript_engine.hpp中对位于 dlfcn.h中的函数的引用。除了最后一个在线程类中有问题。

那么,我该如何解决这个问题呢?Linux上的编译器无关紧要,但必须与MinGW 7.3.0一起使用。

我已经准备好了:

使用 c++
  • 14 而不是 c++17
  • 使用 Chaiscript 版本 6.0 和 5.8.3,带或不带 c++14
  • 使用叮当
  • 在 6.1 和 5.8.3 上不使用 CMake 编译,并设置 -ld-选项(也带有和不使用 C++17(

这是我的CMakeLists.txt:

cmake_minimum_required(VERSION 3.15)
project(ChaiScriptTest)
set(CMAKE_CXX_STANDARD 17)
include_directories(ChaiScript-6.1.0/include)

add_executable(ChaiScriptTest main.cpp)

和我的主要.cpp文件:

#include <iostream>
#include "chaiscript/chaiscript.hpp"
int main() {
chaiscript::ChaiScript chaiScript_;
chaiScript_.eval("print("Hi");");
std::cout << "Hello ChaiScript" << std::endl;
return 0;
}

提前谢谢。

没关系,我自己解决了这个问题...

我查看了文档,发现杰森·特纳(Jason Turner(已经对此表示不满。

chai.add(chaiscript::fun(std::bind(&MacroEngine::setIgnoredMod, me, std::placeholders::_1)), "setIgnoredMods");

如果将同一行更改为

chai.add(chaiscript::fun(&MacroEngine::setIgnoredMod, &me), "setIgnoredMod");

最新更新