如何将gnatmake / gnatbind / gnatlink集成到Cake / Ada代码的CMake文件中?

问题描述 投票:1回答:1

我用几种语言(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,因为我需要链接已经拥有的所有其他功能。

c cmake ada gnat
1个回答
0
投票

这里报道了一个最小的可复制示例。

--- 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
© www.soinside.com 2019 - 2024. All rights reserved.