I am developing a library to easily create an OpenGL window context and display an image on it. I have two CMakeLists.txt files. The first one (top project) is for the .exe file, and the second one (sub project) is for the shared or static library file. I know I can bind two CMakeLists.txt files via the add_subdirectory() command and, by doing that, link the sub project’s output (shared or static lib) to the top-level project.
I am statically linking glew32s.lib and glfw3.lib to my sub project. Then, I am linking my sub project to the top-level project. My sub project compiles without any errors, but my top-level project fails to compile. My top-level project always asks for glew32s.lib and glfw3.lib. Why is this happening if they are statically linked to my sub project?
Here are the error messages:
LINK : fatal error LNK1181: cannot open input file 'glew32s.lib'
LINK : fatal error LNK1181: cannot open input file 'glfw3.lib'
Here is the GitHub repository for the entire code: https://github.com/YsBsr/Some_Test.git
And these are the CMakeLists.txt files that I mentioned.
Sub Project’s CMakeLists.txt file:
cmake_minimum_required(VERSION 3.22)
project(windowhandler)
set(CMAKE_CXX_STANDARD 17)
if (CMAKE_BUILD_TYPE STREQUAL "Release")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /GA /GL /MT /arch:AVX2")
endif ()
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Od /GA /MTd /arch:AVX2")
endif ()
set(BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(THIRD_PARTY_FOLDER ${BASE_DIR}/../__third_party__)
message("sdasd ${THIRD_PARTY_FOLDER}")
# Project Includes
include_directories(${BASE_DIR}/include)
# Third Party Includes
include_directories(${THIRD_PARTY_FOLDER}/glew/include)
add_compile_definitions(GLEW_STATIC)
include_directories(${THIRD_PARTY_FOLDER}/glfw/include)
# GLEW
link_directories(${THIRD_PARTY_FOLDER}/glew/lib/windows)
set(GLEW_TARGET glew32s.lib)
# GLFW
if (CMAKE_BUILD_TYPE STREQUAL "Release")
link_directories(${THIRD_PARTY_FOLDER}/glfw/lib/windows/release)
endif ()
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
link_directories(${THIRD_PARTY_FOLDER}/glfw/lib/windows/debug)
endif ()
set(GLFW_TARGET glfw3.lib)
add_library(
${PROJECT_NAME}
STATIC
${BASE_DIR}/source/window_handler.cpp
)
target_link_libraries(
${PROJECT_NAME}
PRIVATE
${GLEW_TARGET}
${GLFW_TARGET}
#Kernel
user32
opengl32
gdi32
shell32
)
if(NOT VSCODE_BUILD)
set(LIB_OUT_DIR ${BASE_DIR}/__build_out__)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(LIB_OUT_DIR ${LIB_OUT_DIR}/release)
endif(CMAKE_BUILD_TYPE STREQUAL "Release")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(LIB_OUT_DIR ${LIB_OUT_DIR}/debug)
endif(CMAKE_BUILD_TYPE STREQUAL "Debug")
endif(NOT VSCODE_BUILD)
if(VSCODE_BUILD)
set(LIB_OUT_DIR ../${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
endif(VSCODE_BUILD)
set_target_properties(
${PROJECT_NAME}
PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${LIB_OUT_DIR}
)
add_test(
NAME ${PROJECT_NAME}
COMMAND ${PROJECT_NAME}
)
# End Of File
And this is my Top Level Project’s CMakeLists.txt file:
cmake_minimum_required(VERSION 3.22)
set(CMAKE_CONFIGURATION_TYPES Debug Release)
project(OPENCL_IMAGE_PROCESSING_EXAMPLES)
set(CMAKE_CXX_STANDARD 17)
if (CMAKE_BUILD_TYPE STREQUAL "Release")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /GA /GL /MT /arch:AVX2")
endif ()
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Od /GA /MTd /arch:AVX2")
endif ()
if(VSCODE_BUILD)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/release")
endif(CMAKE_BUILD_TYPE STREQUAL "Release")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/debug")
endif(CMAKE_BUILD_TYPE STREQUAL "Debug")
endif(VSCODE_BUILD)
if(NOT VSCODE_BUILD)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/__build_out__/release")
endif(CMAKE_BUILD_TYPE STREQUAL "Release")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/__build_out__/debug")
endif(CMAKE_BUILD_TYPE STREQUAL "Debug")
endif(NOT VSCODE_BUILD)
set(WORKSPACE_FOLDER ${CMAKE_CURRENT_SOURCE_DIR})
# SubProjects
add_subdirectory(${WORKSPACE_FOLDER}/window_handler)
# SubProject Includes
include_directories(${WORKSPACE_FOLDER}/window_handler/include)
add_executable(
${PROJECT_NAME}
${WORKSPACE_FOLDER}/main.cpp
)
target_link_libraries(
${PROJECT_NAME}
PRIVATE
#subprojects
windowhandler
)
# END OF FILE