C++ 项目中同 C 交叉编译时发生 Undefined symbols for architecture x86_64: "xxx" 错误

出现如下错误, C++ 引入 C 库错误
一个比较治标不治本的解决方案是把 C dep 中的 .c 文件改成 .cpp;

关于这个报错, 网上有诸多讨论, 原因也不尽相同, 我这个情况特殊, 大家除非情况完全一样, 否则切莫当真以偏概全, 以免我误人子弟, 本文仅属于个人错误日志;

比较靠谱的解决方法大全推荐这一篇
C++ 常见的 Undefined symbols for architecture *
我初学的时候也通过这边掌握了泛型库(模板)要实现在 h/hpp 中的道理;

[ 41%] Built target glfw
[ 45%] Linking CXX executable craft
Undefined symbols for architecture x86_64:
  "char_width(char)", referenced from:
      _gen_sign_buffer(float*, float, float, float, int, char const*) in main.cpp.o
  "cnd_signal(_opaque_pthread_cond_t*)", referenced from:
      ensure_chunks_worker(Player*, Worker*) in main.cpp.o
  "db_disable()", referenced from:
      _main in main.cpp.o
  "db_get_key(int, int)", referenced from:
      request_chunk(int, int) in main.cpp.o
      create_chunk(Chunk*, int, int) in main.cpp.o
      check_workers() in main.cpp.o
  "db_set_key(int, int, int)", referenced from:
      parse_buffer(char*) in main.cpp.o
  "del_buffer(unsigned int)", referenced from:
      update_player(Player*, float, float, float, float, float, int) in main.cpp.o
      interpolate_player(Player*) in main.cpp.o
      delete_player(int) in main.cpp.o
      delete_all_players() in main.cpp.o
      gen_sign_buffer(Chunk*) in main.cpp.o
      generate_chunk(Chunk*, WorkerItem*) in main.cpp.o
      gen_chunk_buffer(Chunk*) in main.cpp.o
      ...
  "gen_buffer(int, float*)", referenced from:
      gen_crosshair_buffer() in main.cpp.o
      gen_wireframe_buffer(float, float, float, float) in main.cpp.o
      gen_sky_buffer() in main.cpp.o
      render_wireframe(Attrib*, Player*) in main.cpp.o
      render_crosshairs(Attrib*) in main.cpp.o
      _main in main.cpp.o
  "make_plant(float*, float, float, float, float, float, float, int, float)", referenced from:
      gen_plant_buffer(float, float, float, float, int) in main.cpp.o
      compute_chunk(WorkerItem*) in main.cpp.o
      render_item(Attrib*) in main.cpp.o
  "mtx_unlock(_opaque_pthread_mutex_t*)", referenced from:
      check_workers() in main.cpp.o
      ensure_chunks(Player*) in main.cpp.o
      worker_run(void*) in main.cpp.o
  "update_fps(FPS*)", referenced from:
      _main in main.cpp.o
  "client_recv()", referenced from:
      _main in main.cpp.o
  "client_sign(int, int, int, int, char const*)", referenced from:
      set_sign(int, int, int, int, char const*) in main.cpp.o
      on_key(GLFWwindow*, int, int, int, int) in main.cpp.o
  "client_stop()", referenced from:
      _main in main.cpp.o
  "client_talk(char const*)", referenced from:
      parse_command(char const*, int) in main.cpp.o
      on_key(GLFWwindow*, int, int, int, int) in main.cpp.o
  "db_auth_set(char*, char*)", referenced from:
      parse_command(char const*, int) in main.cpp.o
  "is_obstacle(int)", referenced from:
      highest_block(float, float) in main.cpp.o
      hit_test_face(Player*, int*, int*, int*, int*) in main.cpp.o
      collide(int, float*, float*, float*) in main.cpp.o
      render_wireframe(Attrib*, Player*) in main.cpp.o
      on_right_click() in main.cpp.o
  "make_player(float*, float, float, float, float, float)", referenced from:
      gen_player_buffer(float, float, float, float, float) in main.cpp.o
      update_player(Player*, float, float, float, float, float, int) in main.cpp.o
      interpolate_player(Player*) in main.cpp.o
      _main in main.cpp.o
  "make_sphere(float*, float, int)", referenced from:
      gen_sky_buffer() in main.cpp.o
      _main in main.cpp.o
  "thrd_create(_opaque_pthread_t**, int (*)(void*), void*)", referenced from:
      _main in main.cpp.o
  "client_block(int, int, int, int)", referenced from:
      set_block(int, int, int, int) in main.cpp.o
  "client_chunk(int, int, int)", referenced from:
      request_chunk(int, int) in main.cpp.o
      create_chunk(Chunk*, int, int) in main.cpp.o
      check_workers() in main.cpp.o
  "client_light(int, int, int, int)", referenced from:
      toggle_light(int, int, int) in main.cpp.o
  "client_login(char const*, char const*)", referenced from:
      login() in main.cpp.o
  "client_start()", referenced from:
      _main in main.cpp.o
  "create_world(int, int, void (*)(int, int, int, int, void*), void*)", referenced from:
      load_chunk(WorkerItem*) in main.cpp.o
      create_chunk(Chunk*, int, int) in main.cpp.o
      worker_run(void*) in main.cpp.o
  "load_program(char const*, char const*)", referenced from:
      _main in main.cpp.o
  "malloc_faces(int, int)", referenced from:
      gen_cube_buffer(float, float, float, float, int) in main.cpp.o
      gen_plant_buffer(float, float, float, float, int) in main.cpp.o
      gen_player_buffer(float, float, float, float, float) in main.cpp.o
      gen_text_buffer(float, float, float, char*) in main.cpp.o
      update_player(Player*, float, float, float, float, float, int) in main.cpp.o
      interpolate_player(Player*) in main.cpp.o
      gen_sign_buffer(Chunk*) in main.cpp.o
      ...
  "string_width(char const*)", referenced from:
      _gen_sign_buffer(float*, float, float, float, int, char const*) in main.cpp.o
  "client_enable()", referenced from:
      _main in main.cpp.o
  "db_load_signs(SignList*, int, int)", referenced from:
      init_chunk(Chunk*, int, int) in main.cpp.o
      create_chunk(Chunk*, int, int) in main.cpp.o
      ensure_chunks_worker(Player*, Worker*) in main.cpp.o
  "db_load_state(float*, float*, float*, float*, float*)", referenced from:
      _main in main.cpp.o
  "db_save_state(float, float, float, float, float)", referenced from:
      _main in main.cpp.o
  "set_matrix_2d(float*, int, int)", referenced from:
      render_crosshairs(Attrib*) in main.cpp.o
      render_text(Attrib*, int, float, float, float, char*) in main.cpp.o
  "set_matrix_3d(float*, int, int, float, float, float, float, float, float, int, int)", referenced from:
      ensure_chunks_worker(Player*, Worker*) in main.cpp.o
      render_chunks(Attrib*, Player*) in main.cpp.o
      render_signs(Attrib*, Player*) in main.cpp.o
      render_sign(Attrib*, Player*) in main.cpp.o
      render_players(Attrib*, Player*) in main.cpp.o
      render_sky(Attrib*, Player*, unsigned int) in main.cpp.o
      render_wireframe(Attrib*, Player*) in main.cpp.o
      ...
  "sign_list_add(SignList*, int, int, int, int, char const*)", referenced from:
      _set_sign(int, int, int, int, int, int, char const*, int) in main.cpp.o
  "client_connect(char*, int)", referenced from:
      _main in main.cpp.o
  "client_disable()", referenced from:
      _main in main.cpp.o
  "client_version(int)", referenced from:
      _main in main.cpp.o
  "db_auth_select(char*)", referenced from:
      parse_command(char const*, int) in main.cpp.o
  "db_delete_sign(int, int, int, int)", referenced from:
      unset_sign_face(int, int, int, int) in main.cpp.o
      _set_sign(int, int, int, int, int, int, char const*, int) in main.cpp.o
  "db_insert_sign(int, int, int, int, int, int, char const*)", referenced from:
      _set_sign(int, int, int, int, int, int, char const*, int) in main.cpp.o
  "db_load_blocks(Map*, int, int)", referenced from:
      load_chunk(WorkerItem*) in main.cpp.o
      create_chunk(Chunk*, int, int) in main.cpp.o
      worker_run(void*) in main.cpp.o
  "db_load_lights(Map*, int, int)", referenced from:
      load_chunk(WorkerItem*) in main.cpp.o
      create_chunk(Chunk*, int, int) in main.cpp.o
      worker_run(void*) in main.cpp.o
  "frustum_planes(float (*) [4], int, float*)", referenced from:
      ensure_chunks_worker(Player*, Worker*) in main.cpp.o
      render_chunks(Attrib*, Player*) in main.cpp.o
      render_signs(Attrib*, Player*) in main.cpp.o
  "is_transparent(int)", referenced from:
      compute_chunk(WorkerItem*) in main.cpp.o
  "make_character(float*, float, float, float, float, char)", referenced from:
      gen_text_buffer(float, float, float, char*) in main.cpp.o
      render_text(Attrib*, int, float, float, float, char*) in main.cpp.o
  "sign_list_free(SignList*)", referenced from:
      delete_chunks() in main.cpp.o
      delete_all_chunks() in main.cpp.o
      _main in main.cpp.o
  "client_position(float, float, float, float, float)", referenced from:
      _main in main.cpp.o
  "db_delete_signs(int, int, int)", referenced from:
      unset_sign(int, int, int) in main.cpp.o
      _set_block(int, int, int, int, int, int, int) in main.cpp.o
  "db_insert_block(int, int, int, int, int, int)", referenced from:
      _set_block(int, int, int, int, int, int, int) in main.cpp.o
  "db_insert_light(int, int, int, int, int, int)", referenced from:
      toggle_light(int, int, int) in main.cpp.o
      set_light(int, int, int, int, int, int) in main.cpp.o
      _set_block(int, int, int, int, int, int, int) in main.cpp.o
      parse_buffer(char*) in main.cpp.o
  "is_destructable(int)", referenced from:
      builder_block(int, int, int, int) in main.cpp.o
      on_light() in main.cpp.o
      on_left_click() in main.cpp.o
      on_mouse_button(GLFWwindow*, int, int, int) in main.cpp.o
  "set_matrix_item(float*, int, int, int)", referenced from:
      render_item(Attrib*) in main.cpp.o
  "sign_list_alloc(SignList*, int)", referenced from:
      init_chunk(Chunk*, int, int) in main.cpp.o
      create_chunk(Chunk*, int, int) in main.cpp.o
      ensure_chunks_worker(Player*, Worker*) in main.cpp.o
  "load_png_texture(char const*)", referenced from:
      _main in main.cpp.o
  "sign_list_remove(SignList*, int, int, int, int)", referenced from:
      unset_sign_face(int, int, int, int) in main.cpp.o
      _set_sign(int, int, int, int, int, int, char const*, int) in main.cpp.o
  "make_character_3d(float*, float, float, float, float, int, char)", referenced from:
      _gen_sign_buffer(float*, float, float, float, int, char const*) in main.cpp.o
  "db_auth_select_none()", referenced from:
      parse_command(char const*, int) in main.cpp.o
  "db_delete_all_signs()", referenced from:
      _main in main.cpp.o
  "make_cube_wireframe(float*, float, float, float, float)", referenced from:
      gen_wireframe_buffer(float, float, float, float) in main.cpp.o
      render_wireframe(Attrib*, Player*) in main.cpp.o
  "db_auth_get_selected(char*, int, char*, int)", referenced from:
      login() in main.cpp.o
  "sign_list_remove_all(SignList*, int, int, int)", referenced from:
      unset_sign(int, int, int) in main.cpp.o
      _set_block(int, int, int, int, int, int, int) in main.cpp.o
  "wrap(char const*, int, char*, int)", referenced from:
      _gen_sign_buffer(float*, float, float, float, int, char const*) in main.cpp.o
  "db_init(char*)", referenced from:
      _main in main.cpp.o
  "map_get(Map*, int, int, int)", referenced from:
      _hit_test(Map*, float, int, float, float, float, float, float, float, int*, int*, int*) in main.cpp.o
      hit_test(int, float, float, float, float, float, int*, int*, int*) in main.cpp.o
      collide(int, float*, float*, float*) in main.cpp.o
      toggle_light(int, int, int) in main.cpp.o
      get_block(int, int, int) in main.cpp.o
      builder_block(int, int, int, int) in main.cpp.o
      paste() in main.cpp.o
      ...
  "map_set(Map*, int, int, int, int)", referenced from:
      map_set_func(int, int, int, int, void*) in main.cpp.o
      toggle_light(int, int, int) in main.cpp.o
      set_light(int, int, int, int, int, int) in main.cpp.o
      _set_block(int, int, int, int, int, int, int) in main.cpp.o
      parse_buffer(char*) in main.cpp.o
  "cnd_init(_opaque_pthread_cond_t*)", referenced from:
      _main in main.cpp.o
  "cnd_wait(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*)", referenced from:
      worker_run(void*) in main.cpp.o
  "db_close()", referenced from:
      _main in main.cpp.o
  "is_plant(int)", referenced from:
      compute_chunk(WorkerItem*) in main.cpp.o
      render_item(Attrib*) in main.cpp.o
      on_left_click() in main.cpp.o
  "map_copy(Map*, Map*)", referenced from:
      check_workers() in main.cpp.o
      ensure_chunks_worker(Player*, Worker*) in main.cpp.o
  "map_free(Map*)", referenced from:
      delete_chunks() in main.cpp.o
      delete_all_chunks() in main.cpp.o
      check_workers() in main.cpp.o
      _main in main.cpp.o
  "mtx_init(_opaque_pthread_mutex_t*, int)", referenced from:
      _main in main.cpp.o
  "mtx_lock(_opaque_pthread_mutex_t*)", referenced from:
      check_workers() in main.cpp.o
      ensure_chunks(Player*) in main.cpp.o
      worker_run(void*) in main.cpp.o
  "simplex2(float, float, int, float, float)", referenced from:
      compute_chunk(WorkerItem*) in main.cpp.o
  "tokenize(char*, char const*, char**)", referenced from:
      _gen_sign_buffer(float*, float, float, float, int, char const*) in main.cpp.o
      parse_buffer(char*) in main.cpp.o
  "db_commit()", referenced from:
      _main in main.cpp.o
  "db_enable()", referenced from:
      _main in main.cpp.o
  "gen_faces(int, int, float*)", referenced from:
      gen_cube_buffer(float, float, float, float, int) in main.cpp.o
      gen_plant_buffer(float, float, float, float, int) in main.cpp.o
      gen_player_buffer(float, float, float, float, float) in main.cpp.o
      gen_text_buffer(float, float, float, char*) in main.cpp.o
      update_player(Player*, float, float, float, float, float, int) in main.cpp.o
      interpolate_player(Player*) in main.cpp.o
      gen_sign_buffer(Chunk*) in main.cpp.o
      ...
  "make_cube(float*, float (*) [4], float (*) [4], int, int, int, int, int, int, float, float, float, float, int)", referenced from:
      gen_cube_buffer(float, float, float, float, int) in main.cpp.o
      compute_chunk(WorkerItem*) in main.cpp.o
      render_item(Attrib*) in main.cpp.o
  "map_alloc(Map*, int, int, int, int)", referenced from:
      init_chunk(Chunk*, int, int) in main.cpp.o
      create_chunk(Chunk*, int, int) in main.cpp.o
      ensure_chunks_worker(Player*, Worker*) in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [craft] Error 1
make[2]: *** [CMakeFiles/craft.dir/all] Error 2
make[1]: *** [CMakeFiles/craft.dir/rule] Error 2
make: *** [craft] Error 2
posted @ 2021-11-12 23:37  throw_new_NullPointe  阅读(324)  评论(0编辑  收藏  举报