在PHP的开发中,开发人员常常会使用PHP扩展来提高程序性能或增加功能。CMake是一个跨平台的编译工具,在编译扩展时也很常用。那么如何使用CMake编译一个PHP扩展呢?
下面以一个示例为例,说明CMake如何编译一个PHP扩展:
project(test_ext C) cmake_minimum_required(VERSION 2.8) # Make sure PHP Development package is installed find_package(PHP REQUIRED) # Define sources set(SOURCES test_ext.c ) # Create the extension add_library(test_ext SHARED ${SOURCES}) # Link the extension target_link_libraries(test_ext ${PHP_LIBRARIES} ) # Set output name set_target_properties(test_ext PROPERTIES PREFIX "") # Set output directory set_target_properties(test_ext PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib")
上面的示例中定义了一个项目名为test_ext,引入了PHP的相关头文件,设置了代码文件test_ext.c,创建了一个名为test_ext的动态链接库文件,并将PHP库文件链接到该库文件中,最后设置了输出文件名和输出路径。
对于一个更复杂的扩展,可以使用更多的CMake模块来方便地实现编译:
project(test_ext CXX) cmake_minimum_required(VERSION 2.8) SET(CMAKE_CXX_FLAGS "-std=c++11 -Wall") find_package(PHP REQUIRED) find_package(Boost REQUIRED COMPONENTS system thread) find_package(ZMQ REQUIRED) SET(MODULE_NAME "test_ext") SET(TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}/test") SET(SOURCE_FILES test_ext.cpp ) add_library(${MODULE_NAME} SHARED ${SOURCE_FILES}) include_directories( SYSTEM ${PHP_INCLUDE_DIRS} SYSTEM ${Boost_INCLUDE_DIRS} SYSTEM ${ZMQ_INCLUDE_DIRS} ) target_link_libraries(${MODULE_NAME} ${PHP_LIBRARIES} ${ZMQ_LIBRARIES} ${Boost_LIBRARIES} ) set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") set_target_properties(${MODULE_NAME} PROPERTIES OUTPUT_NAME "${MODULE_NAME}.so") set_target_properties(${MODULE_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib") # Build tests enable_testing() add_executable(tests ${TEST_DIR}/test.cpp ) target_link_libraries(tests ${Boost_LIBRARIES} ${MODULE_NAME} ) set_target_properties(tests PROPERTIES OUTPUT_NAME "test") add_test( NAME tests COMMAND ${CMAKE_CURRENT_BINARY_DIR}/tests CONFIGURATIONS Debug )
上面的示例中定义了一个名为test_ext的项目,引入了PHP、Boost和ZMQ的相关头文件和库文件,设置了源文件,创建了一个名为test_ext的动态链接库文件,并将相关库文件链接到该库文件中,最后设置了输出文件名和输出路径。还定义了一个名为tests的可执行文件,用于测试扩展的功能。
总之,使用CMake编译PHP扩展并不难,只需要写好相应的CMakeLists.txt文件即可。CMake可以自动解决跨平台的编译问题,帮助开发人员更方便地开发PHP扩展。