我用几种语言(C,C ++,Fortran77,Fortran90)编写了代码,并且可以使用CMake进行编译而不会出现任何问题。效果很好。
现在,我想添加main(),它是用C语言编写的一些Ada函数,我想通过CMake对其进行编译。鉴于我无法使用CMake将Ada函数链接到主要函数,我得到
main.c:(.text.startup+0x16a): undefined reference to adainit
main.c:(.text.startup+0x179): undefined reference to adafunction
main.c:(.text.startup+0x190): undefined reference to adafinal
[我通过使用主函数(用C编写)调用了唯一的Ada函数进行了另一个简化的测试,该函数我进行了编码,并通过使用进行了编译
gcc -c main.c
gnatmake -c lib_ada.ali
gnatbind -n lib_ada.ali
gnatlink lib_ada.ali main.o -o exe
并且可以解决。您知道如何将这种方法集成到CMakeList.txt中吗?
注:我认为(也许我错了)我不能使用唯一的gnatlink,因为我需要链接已经拥有的所有其他功能。
这里报道了一个最小的可复制示例。
--- main.c ---
#include <stdio.h>
extern int adainit();
extern int adafinal();
extern int Add(int,int);
int main()
{
adainit();
printf ("Sum of 3 and 4 is: %d\n", Add (3,4));
adafinal();
return 0;
}
--- lib_test.adb ---
package body Lib_Test is
function Ada_Add (A, B : Integer) return Integer is
begin
return A + B;
end Ada_Add;
end Lib_Test;
--- lib_test.ads ---
package Lib_Test is
function Ada_Add (A, B : Integer) return Integer;
pragma Export (C, Ada_Add, "Add");
end Lib_Test;
1°测试:如果使用以下命令进行编译:
gcc -c main.c
gnatmake -c lib_test.adb
gnatbind -n lib_test.ali
gnatlink lib_test.ali main.o -o exe
并运行./exe
,您会得到Sum of 3 and 4 is: 7
。
2°测试:我尝试使用链接* .a的以下CMake文件(CMakeLists.txt)>
cmake_minimum_required(VERSION 2.6) project(Ada2C) enable_language(C) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -m64") find_library(TEST_lib lib_test.a PATHS ${CMAKE_CURRENT_SOURCE_DIR}) message(STATUS "Finding library: ${TEST_lib}") add_executable(TEST_release ${CMAKE_CURRENT_SOURCE_DIR}/main.c) target_link_libraries(TEST_release ${TEST_lib})
我为Ada函数生成库lib_test.a
gnatmake lib_test.adb ar rc lib_test.a
我运行
cmake .
和make
,然后得到
main.c:(.text.startup+0x16a): undefined reference to adainit
main.c:(.text.startup+0x179): undefined reference to adafunction
main.c:(.text.startup+0x190): undefined reference to adafinal