C++ 如何创建CMAKE脚本以构建C++;嵌入Python的应用程序?

C++ 如何创建CMAKE脚本以构建C++;嵌入Python的应用程序?,c++,cmake,C++,Cmake,要使用嵌入式Python编译C应用程序,对于s的简单项目,以下内容非常有用: gcc -std=c99 -ggdb3 -O0 -pedantic-errors -Wall -Wextra \ -fpie $(/opt/python/38/bin/python3-config --cflags --embed) -o 'app' \ 'main.c' $(/opt/python/38/bin/python3-config --embed --ldflags) 要编译并运行此代码,

要使用嵌入式Python编译C应用程序,对于s的简单项目,以下内容非常有用:

  gcc -std=c99 -ggdb3 -O0 -pedantic-errors -Wall -Wextra \
  -fpie $(/opt/python/38/bin/python3-config   --cflags --embed) -o 'app' \
  'main.c' $(/opt/python/38/bin/python3-config --embed --ldflags)
要编译并运行此代码,请执行以下操作:

   #define PY_SSIZE_T_CLEAN
   #include <python3.8/Python.h>

   int main(int argc, char *argv[]) {
    
    wchar_t *program = Py_DecodeLocale(argv[0], NULL);

    Py_SetProgramName(program);
    Py_Initialize();

    PyRun_SimpleString("print(list(range(0,5)))");

    if (Py_FinalizeEx() < 0) {
        exit(120);
    }
    PyMem_RawFree(program);
    return 0;
    
   }
但不起作用,结果是:未定义对“main”的引用。
任何建议

这里有一个正在运行的CMAKE脚本,它成功地编译了一个嵌入Python的C程序(通过#include)


应通过
target\u link\u库
执行链接,设置
CMAKE\u EXE\u LINKER\u标志
不足以实现此目的。使用
--libs
选项调用
python3 config
,并在
target\u link\u libraries
调用中使用其输出(在去掉可能的
-l
前缀后)。非常感谢,这让我找到了正确的答案。CMAKE是一个可怕的文档工具。非常感谢你。
cmake_minimum_required(VERSION 3.17)
project(app C)

set(CMAKE_C_STANDARD 99)

add_executable(app main.c)

execute_process(COMMAND python3-config --cflags  --embed OUTPUT_VARIABLE PY_CFLAGS)
execute_process(COMMAND python3-config --ldflags --embed OUTPUT_VARIABLE PY_LDFLAGS)

SET(PY_CFLAGS  "-std=c99 -ggdb3 -O0 -pedantic-errors -Wall -Wextra -fpie ${PY_CFLAGS}")
SET(GCC_COVERAGE_LINK_FLAGS  "${PY_LDFLAGS}")

SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${PY_CFLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${PY_LDFLAGS}")

cmake_minimum_required(VERSION 3.17)
project(myapp C)

set(CMAKE_C_STANDARD 99)

add_executable(myapp main.c) 

include_directories(/opt/python/38/include/python3.8)
link_directories(/opt/python/38/lib)

target_link_libraries(myapp python3.8 crypt pthread dl util m)