SimGrid。对msg.h中导入函数的未定义引用

时间:2016-05-20 00:24:51

标签: c cmake simgrid

我想通过CLion代码编辑器使用simgrid来实现master-worker应用程序。 我有这样的CMakeLists.txt:

project(FirstAgent)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.c)
add_executable(FirstAgent ${SOURCE_FILES})

main.c的结构如下。 MSG_init()MSG_main等是来自simgrid / msg.h的函数。 (如果我按住Ctrl +左键单击该功能,将打开simgrid / msg.g中的相应功能):

#include <stdio.h>
#include <simgrid/msg.h>

int main(int argc, char *argv[]){
    MSG_init(&argc, argv);
    MSG_function_register("master", master);
    MSG_create_environment("platform.xml");
    MSG_launch_application("deployment.xml");
    MSG_main();
    return 0;
}
int worker(int argc, char *argv[]){...}
int master(int argc, char *argv[]){...}

但是我从simrid / msg.h导入的函数无法识别。它给出了一个错误:

/home/ken/CLionProjects/FirstAgent/main.c:10: undefined reference to `sg_version_check'
/home/ken/CLionProjects/FirstAgent/main.c:10: undefined reference to `MSG_init_nocheck'
/home/ken/CLionProjects/FirstAgent/main.c:12: undefined reference to `MSG_function_register'
/home/ken/CLionProjects/FirstAgent/main.c:13: undefined reference to `MSG_function_register'
/home/ken/CLionProjects/FirstAgent/main.c:15: undefined reference to `MSG_create_environment'
/home/ken/CLionProjects/FirstAgent/main.c:16: undefined reference to `MSG_launch_application'
/home/ken/CLionProjects/FirstAgent/main.c:18: undefined reference to `MSG_main'
...

如何正确设置项目以避免这种情况?

UPD

添加target_link_libraries(FirstAgent simgrid)后,只剩下一个错误:

/home/ken/CLionProjects/FirstAgent/main.c:10:未定义的引用

`sg_version_check'
collect2: error: ld returned 1 exit status
make[3]: *** [FirstAgent/FirstAgent] Error 1
make[2]: *** [CMakeFiles/FirstAgent.dir/all] Error 2
make[1]: *** [CMakeFiles/FirstAgent.dir/rule] Error 2
make: *** [FirstAgent] Error 2

1 个答案:

答案 0 :(得分:2)

如果您缺少每个SimGrid符号,那是因为您需要在CMakeLists.txt的末尾添加以下内容

target_link_libraries(FirstAgent simgrid)

如果您只缺少sg_version_check,则可能是您使用的是错误版本的库。

如果您使用的是Linux,请尝试键入ldd yourprogram并查找运行时使用的simgrid库的路径。如果它是我怀疑的旧版本,只需将其删除并重新启动您的程序即可。系统应该在磁盘上搜索另一个simgrid实例,可能是正确的。

如果您不使用Linux,请在整个磁盘中搜索被遗忘的simgrid库并将其删除。