我正在做一个学生项目,我们希望使用ChaiSript (6.1)作为脚本语言。我们在Linux和Windows上使用CLion和CMake。另外,我们使用的是SFML,所以在Windows7.3.0环境下必须使用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。
我已经尝试过的是:
f 210
这是我的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)我的main.cpp文件:
#include <iostream>
#include "chaiscript/chaiscript.hpp"
int main() {
chaiscript::ChaiScript chaiScript_;
chaiScript_.eval("print(\"Hi\");");
std::cout << "Hello ChaiScript" << std::endl;
return 0;
}提前谢谢。
发布于 2020-04-11 10:43:07
不过,我自己解决了问题..。
我查看了文档,发现Jason已经了解到了这一点。
chai.add(chaiscript::fun(std::bind(&MacroEngine::setIgnoredMod, me, std::placeholders::_1)), "setIgnoredMods");如果将同一行更改为
chai.add(chaiscript::fun(&MacroEngine::setIgnoredMod, &me), "setIgnoredMod");https://stackoverflow.com/questions/59114880
复制相似问题