CMake 和 Cuda 在设备上单独编译类构造函数在链接期间失败

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

我在通过 CMake 链接设备上的构造函数时遇到问题。仅当在类内调用函数时才会引起麻烦。你有什么想法吗?

我尝试使用 nvcc ...-dc 和 -dlink 手动编译和链接,效果很好。

输出失败

ptxas fatal   : Unresolved extern function '_ZN4TestC1Ev'
CMake Error at genetic_program_lib_generated_test.cu.o.debug.cmake:282 (message):
  Error generating file
  /article/src/build/CMakeFiles/genetic_program_lib.dir/src/./genetic_program_lib_generated_test.cu.o

CMake

cmake_minimum_required(VERSION 3.22)
project(GeneticProgramming)

set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/article/src/build")
set(CMAKE_BUILD_TYPE debug)

include_directories(include)

# add cuda source files to variable
file(GLOB CUDA_SOURCES src/genetic_program.cu src/test.cu src/test2.cu)
file(GLOB MAIN main/main.cpp)

# find the cuda package
find_package(CUDA REQUIRED)

cuda_add_library(genetic_program_lib ${CUDA_SOURCES})
set_target_properties(genetic_program_lib PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

# create the executable
add_executable(out ${MAIN})
target_link_libraries(out genetic_program_lib)

主要

#include <genetic_program.hpp>
int main() 
{
    genetic_program();
    return 0;
}

遗传程序.hpp

#pragma once
#include <iostream>
int genetic_program();

遗传程序.cu

#include <genetic_program.hpp>
#include <test.cuh>
int genetic_program()
{
    test<<<1,1>>>();
    return 0;
}

测试.cuh

#pragma once
#include <iostream>
#include <test2.cuh>

__global__ void test();

测试.cu

#include <test.cuh>
__global__ void test(){
    printf("Hello World!\n");
    Test t;
    t.test2t();
}

test2.cuh

#pragma once
#include <iostream>

class Test
{
    public:
        __device__ Test();
        __device__ void test2t();
};

test2.cu

#include <test2.cuh>
__device__ Test::Test()
{
    printf("Test::Test()\n");
}
__device__ void Test::test2t()
{
    printf("Test::test2t()\n");
}

编辑:更新命名约定。

c++ cmake cuda linker nvcc
1个回答
0
投票

CUDA
语言支持和
CUDA_SEPARABLE_COMPILATION
属性均随 CMake 3.8 一起提供,并且不能与旧版
CUDA
包一起使用。

cmake_minimum_required(VERSION 3.22)

set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/article/src/build")
set(CMAKE_BUILD_TYPE debug)

project(GeneticProgramming LANGUAGES CUDA CXX)

include_directories(include)

# add cuda source files to variable
file(GLOB CUDA_SOURCES src/genetic_program.cu src/test.cu src/test2.cu)
file(GLOB MAIN main/main.cpp)

# cuda_add_library(genetic_program_lib ${CUDA_SOURCES})
add_library(genetic_program_lib ${CUDA_SOURCES})
set_target_properties(genetic_program_lib PROPERTIES CUDA_SEPARABLE_COMPILATION ON) 

# create the executable
add_executable(out ${MAIN})
target_link_libraries(out genetic_program_lib)

对我有用。

请注意,像

CMAKE_BUILD_TYPE
这样的全局变量需要在
project
调用之前设置才能生效。

© www.soinside.com 2019 - 2024. All rights reserved.