问题描述
我正在尝试运行c ++ actor框架的hello world示例。 当尝试使用cmaketools扩展名构建vscode时,我得到的输出是找不到包CAF。当我注释掉所有cmakelists.txt文件中与caf相关的行时,cmake会生成test.cpp,并且我可以运行test.exe。我已经通过vcpkg安装了caf和catch2,如控制台输出图片所示。在catch2处,我使用的是findpackage和target_link_libraries,如CMakeLists.txt中的图片所示。但是caf不提供有关如何查找程序包和target_link_libraries的任何信息。在CAF的git上有find_package(需要CAF),但是它不起作用。 我试图找出caf提供的其他软件包,但没有找到。
./ CMakeLists.txt:
cmake_minimum_required(VERSION 3.18.1)
set(CMAKE_TOOLCHAIN_FILE "c:/Users/daniel/Documents/vcpkg/vcpkg/scripts/buildsystems/vcpkg.cmake") #relative path does not work
set(CMAKE_CXX_STANDARD 14)
project(mgoe)
find_package(Catch2 CONfig required)
find_package(CAF required)
add_subdirectory(programs)
./ programs / CMakeLists.txt:
add_executable(caf_helloworld caf_helloworld.cpp)
add_executable(test test.cpp)
target_link_libraries(
caf_helloworld
libcaf_io
libcaf_core
)
target_link_libraries(
test
Catch2::Catch2
)
./ programs / caf_helloword.cpp:
#include <iostream>
#include "caf/all.hpp"
using std::endl;
using std::string;
using namespace caf;
behavior mirror(event_based_actor* self) {
// return the (initial) actor behavior
return {
// a handler for messages containing a single string
// that replies with a string
[=](const string& what) -> string {
// prints "Hello World!" via aout (thread-safe cout wrapper)
aout(self) << what << endl;
// reply "!dlroW olleH"
return string(what.rbegin(),what.rend());
}
};
}
void hello_world(event_based_actor* self,const actor& buddy) {
// send "Hello World!" to our buddy ...
self->request(buddy,std::chrono::seconds(10),"Hello World!").then(
// ... wait up to 10s for a response ...
[=](const string& what) {
// ... and print it
aout(self) << what << endl;
}
);
}
void caf_main(actor_system& system) {
// create a new actor that calls 'mirror()'
auto mirror_actor = system.spawn(mirror);
// create another actor that calls 'hello_world(mirror_actor)';
system.spawn(hello_world,mirror_actor);
// system will wait until both actors are destroyed before leaving main
}
// creates a main function for us that calls our caf_main
CAF_MAIN()
./ programs / test.cpp:
#define CATCH_CONfig_MAIN // This tells Catch to provide a main() - only do this in one cpp file
#include "catch2/catch.hpp"
cmake工具构建输出:
[main] Ordner wird erstellt: mgoe
[build] Build wird gestartet.
[proc] Befehl wird ausgeführt: "C:\Program Files\CMake\bin\cmake.EXE" --build c:/Users/daniel/Documents/projects/mgoe/build --config Release --target ALL_BUILD -- /maxcpucount:6
[build] CMake is re-running because C:/Users/daniel/Documents/projects/mgoe/build/CMakeFiles/generate.stamp is out-of-date.
[build] the file 'C:/Users/daniel/Documents/projects/mgoe/CMakeLists.txt'
[build] is newer than 'C:/Users/daniel/Documents/projects/mgoe/build/CMakeFiles/generate.stamp.depend'
[build] result='-1'
[build] -- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.19041.
[build] CMake Error at C:/Users/daniel/Documents/vcpkg/vcpkg/scripts/buildsystems/vcpkg.cmake:493 (_find_package):
[build] By not providing "FindCAF.cmake" in CMAKE_MODULE_PATH this project has
[build] asked CMake to find a package configuration file provided by "CAF",but
[build] CMake did not find one.
[build]
[build] Could not find a package configuration file provided by "CAF" with any of
[build] the following names:
[build]
[build] CAFConfig.cmake
[build] caf-config.cmake
[build]
[build] Add the installation prefix of "CAF" to CMAKE_PREFIX_PATH or set "CAF_DIR"
[build] -- Configuring incomplete,errors occurred!
[build] See also "C:/Users/daniel/Documents/projects/mgoe/build/CMakeFiles/CMakeOutput.log".
[build] to a directory containing one of the above files. If "CAF" provides a
[build] separate development package or SDK,be sure it has been installed.
[build] Call Stack (most recent call first):
[build] CMakeLists.txt:12 (find_package)
[build]
[build]
[build] CMake Configure step Failed. Build files cannot be regenerated correctly.
[cmakefileapi-parser] Unerwartete codemodellversion (2.1) von cmake-file-api. Erwartet: (2.0). Möglicherweise ist die IntelliSense-Konfiguration falsch.
[cmakefileapi-parser] Unerwartete codemodellversion (2.1) von cmake-file-api. Erwartet: (2.0). Möglicherweise ist die IntelliSense-Konfiguration falsch.
[build] Der Build wurde mit dem Exitcode 4294967295 abgeschlossen.
解决方法
CAF未导出/安装CMake目标,因此无法通过find_package
使用。我查看了构建树,并在FindCAF.cmake
子目录中看到了cmake
。
在vcpkg中打开一个问题,该文件应安装到适当的位置或要求上游安装它(为什么提供但未安装该文件超出了我的范围)。作为一种快速的解决方法,您应该只需将文件复制到CMAKE_MODULE_PATH